最近狀態很差,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;
}