最近状态很差,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;
}