今天第一天上课
内容:二分,三分,位运算,折半法
本来还想听一听退火可老师竟怂到不敢讲
看了看A层题,觉得好无奈
T1输出了个2就回去听课了
听说supairy大佬A了T1,A层都如此NB吗?
要听A层讲解可以去看一看supairy的博客不知道他发不发
下面给出B层题题解
密码:xjzjd(相聚在交大)
T1:
解释:无
解法:暴力
注意事项:1.一定要使得三种颜色全部出现
2.n或m一定有整除3的
3.只在能整除3的边上更新
代码:
#include<bits/stdc++.h> using namespace std; #define ll long long #define gg c=getchar() #define pd (c>='0'&&c<='9') inline int read() { int s=0; char gg; for(;!pd;gg); for(;pd;gg)s=(s<<1)+(s<<3)+c-'0'; return s; } char c[1001][1001]; inline bool pd1(int n,int m) { if(n%3!=0)return 0; n/=3; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1][1]) return 0; } // cout<<"\n"; for(int i=1+n;i<=n+n;i++) for(int j=1;j<=m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1+n][1]) return 0; } // cout<<"\n"; for(int i=1+n+n;i<=n+n+n;i++) for(int j=1;j<=m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1+n+n][1]) return 0; } //cout<<"\n"; if(c[1][1]+c[n+1][1]+c[n+n+1][1]=='R'+'G'+'B')return 1; return 0; } inline bool pd2(int n,int m) { if(m%3!=0)return 0; m/=3; for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1][1]) return 0; } // cout<<"\n"; for(int i=1;i<=n;i++) for(int j=1+m;j<=m+m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1][1+m]) return 0; } // cout<<"\n"; for(int i=1;i<=n;i++) for(int j=1+m+m;j<=m+m+m;j++) { //cout<<c[i][j]; if(c[i][j]!=c[1][1+m+m]) return 0; } //cout<<"\n"; if(c[1][1]+c[1][1+m]+c[1][1+m+m]=='R'+'G'+'B')return 1; return 0; } int main() { int n=read(),m=read(); for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { c[i][j]=getchar(); while(c[i][j]!='R'&&c[i][j]!='B'&&c[i][j]!='G')c[i][j]=getchar(); } } /*for(int i=1;i<=n;i++) { for(int j=1;j<=m;j++) { cout<<c[i][j]; } cout<<endl; }*/ if(pd1(n,m))cout<<"YES"; else if(pd2(n,m))cout<<"YES"; else cout<<"NO"; }
T2: