最近状态很差,A题居然WA了一发,然后B没仔细观察规律前缀是否翻转和后缀的长度有关,C其实是会做的,但是不够自信又纠结在B,以后要是卡题要快点跳,不能畏惧题目,面对困难要深呼吸,或者去洗把脸冷静下再思考。
D题不难,但是我写的程序总有一点bug,写的又慢,我的程序实现能力需要锻炼,做题还要再冷静一些,其实说实话div2 ABC三题都是思维为主,应该要快速的A掉,后面就稍微有点算法实现能力的需要了,还要去总结一下stl,熟练掌握stl。

B. String Modification
思路:
找规律 暴力模拟
新遇到的stl:
make_pair(s,1)自动匹配类型更方便

string.substr(0,i-1); 复制[0,i-1)的子串

string.begin() string.end()

reverse(u.begin(),u.end());

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <cmath>
#include <algorithm>
#include <queue>
#include <stack>
#include <set>

using namespace std;
typedef long long ll;
typedef pair<int,int>P;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 + 7;
const ll maxn = 1e6 + 5;

int main(){
	int T;
	cin>>T;
	while(T--){
		int n;
		string s;
		cin>>n>>s;
		pair<string, int>ans=make_pair(s,1);
		for(int i=2;i<=n;++i){
			string t=s.substr(i-1);
			string u=s.substr(0,i-1);
			if((n-(i-1))%2==1){//后缀的个数为单数 前缀要翻转
				reverse(u.begin(),u.end());
			}
			ans=min(make_pair(t+u,i),ans);
		}
		cout<<ans.first<<"\n"<<ans.second<<'\n';
	}
	return 0;
}

C. Primitive Primes
思路:
多项式展开得a、b数组第一个不被p整除的和的那一项必然不被p整除

#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
int n,m,p,a[1000005],b[1000005];
int main()
{
	scanf("%d%d%d",&n,&m,&p);
	for(int i=0;i<n;i++)
	{
		scanf("%d",&a[i]);
		a[i]%=p;
	}
	for(int i=0;i<m;i++)
	{
		scanf("%d",&b[i]);
		b[i]%=p;
	}
	int x=0,y=0;
	while(a[x]==0)x++;
	while(b[y]==0)y++;
	printf("%d\n",x+y);
	return 0;
}

D. Nash Matrix
思路:
构造 染色 DFS
一开始我总是想着从一个非(-1,-1)的点去搜X的那个点,但是这样是十分困难的,而且可能压根连不到那个X,正难则反,我们应该从X入手去染色能到达且想到X的点。
至于(-1,-1)点的dfs可以正着染色,搜到最后无路可走的时候最后一步染色结果为上一步,所以这里要保存上一步相反的走法在char str中。
最后检验是否有非字母的点 如果有则INVALID否则VALID并输出答案。

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const double eps = 1e-10;
const int INF = 0x3f3f3f3f;
const ll mod  = 1e9 +7;
const ll MAXN = 1e6 + 5;
const int N = 1005;

int x[N][N];
int y[N][N];
char c[N][N];
bool vis[N][N];
int n;
int dx[4]={0,0,1,-1};
int dy[4]={1,-1,0,0};
char ch1[5]="LRUD";
char ch2[5]="RLDU";

void dfs(int p,int q){
	for(int i=0;i<4;i++){
		int np=p+dx[i];
		int nq=q+dy[i];
		if(x[np][nq]==-1 || vis[np][nq] || np<1 || np>n || nq<1 || nq>n) continue;
		if(x[np][nq]!=x[p][q] || y[np][nq]!=y[p][q]) continue;
		vis[np][nq]=true;
		c[np][nq]=ch1[i];
		dfs(np,nq);
	}
}

void DFS(int p,int q,char str){
	bool flag=false;
	for(int i=0;i<4;i++){
		int np=p+dx[i];
		int nq=q+dy[i];
		if(x[np][nq]!=-1 || vis[np][nq] || np<1 || np>n || nq<1 || nq>n){
			if(!flag && i==3){
				c[p][q]=str;
			}
			continue;
		}
		flag=true;
		c[p][q]=ch2[i];
		vis[np][nq]=true;
		DFS(np,nq,ch1[i]);
	}
}


int main(){
	ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>n;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cin>>x[i][j]>>y[i][j];
			if(x[i][j]==i && y[i][j]==j){c[i][j]='X',vis[i][j]=true;}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(c[i][j]=='X'){
				vis[i][j]=true;
				dfs(i,j);
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(x[i][j]==-1&&!vis[i][j]){
				DFS(i,j,'1');
			}
		}
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			if(!isalpha(c[i][j])){
				cout<<"INVALID\n";
				return 0;
			}
		}
	}
	cout<<"VALID\n";
	for(int i=1;i<=n;i++){
		for(int j=1;j<=n;j++){
			cout<<c[i][j];
		}
		cout<<"\n";
	}
	return 0;
}