A - Colour the Flag
有一个n*m矩阵
要将空白格子涂成红或者白
使得相邻两个格子颜色不一样
只要有一个涂上颜色则可确定最终的涂色结果
绝了 这题怎么代码量更大
int n,m; char s[55],c[2]; bool ju; void solve() { sdd(n,m); c[0]='A'; ju=0; rep(i,1,n) { sc(s+1); if(ju)continue; rep(j,1,m) { if(s[j]=='.')continue; int pos=(i+j)&1; if(c[0]=='A')//前面没有已涂色的 { c[1]='R';c[0]='W'; if(pos&&s[j]=='W'||!pos&&s[j]=='R') c[1]='W',c[0]='R'; } else { if(c[pos]!=s[j])ju=1; } } } if(ju)puts("NO"); else { puts("YES"); if(c[0]=='A')c[0]='R',c[1]='W'; rep(i,1,n) { rep(j,1,m) { int pos=(i+j)&1; printf("%c",c[pos]); } puts(""); } } }
B. Histogram Ugliness
我可以,陪你去看星星~
将一个直方图的某一列削掉几个
结果为直方图左右边边的数目+操作次数
如果左右的数都比当前数小,就可以将这个值减去h[i]-max(h[i-1],h[i+1])
为什么错了呢
没毛病呀
还好没打。。不然要被气死了哈
!!!!h[n+1]的值没赋0
我是傻子qwq
int n,h[maxn]; ll ans; void solve() { sd(n);ans=0; rep(i,1,n)sd(h[i]),ans+=abs(h[i]-h[i-1]); ans+=h[n]; h[n+1]=0; rep(i,1,n) { if(h[i]>h[i-1]&&h[i]>h[i+1])ans-=h[i]-max(h[i-1],h[i+1]); } plld(ans); }
C. Little Alawn's Puzzle
一个2*n的矩阵
每一行都是n的全排列
要同一行同一列的数都不一样
通过交换同一列的两个数实现
问能够得到多少种满足条件的矩阵
那就是这些数构成一个一个的环
答案就是kpow(2,cnt):cnt是环的个数
如果存在环的大小为1的话答案就是0
int n,a[maxn],b[maxn],pos[maxn],cnt; bool vis[maxn]; int kpow(int a,int b) { int ans=1; while(b) { if(b&1)ans=1ll*ans*a%mod; a=1ll*a*a%mod; b>>=1; } return ans; } void solve() { sd(n);cnt=0; rep(i,1,n)sd(a[i]),vis[i]=0,pos[a[i]]=i; rep(i,1,n)sd(b[i]); rep(i,1,n) { if(vis[i])continue; if(a[i]==b[i]) { puts("0"); return; } cnt++; int las=b[i]; while(las!=a[i]) { vis[pos[las]]=1; las=b[pos[las]]; } } pd(kpow(2,cnt)); }
D. Lost Tree
有n个点的树,让你猜哪些是边
选择一个点r,可以得到其它点到r的最短距离
可以询问n/2次!!!向上取整!!!
~~那就是间隔一层询问一次~~
看以1为根结点时,奇数层的个数与偶数层个数的大小
int n,r,x,a[maxn]; int cnt1,cnt2; bool is[maxn][maxn]; void solve() { sd(n); printf("? 1 ");fflush(stdout); cnt2=-1; rep(i,1,n) { sd(a[i]); if(a[i]&1)cnt1++; else cnt2++; if(a[i]==1)is[1][i]=is[i][1]=1; } int ju=(cnt1>=cnt2); rep(i,2,n) { if((a[i]&1)==ju)continue; printf("? %d ",i);fflush(stdout); rep(j,1,n) { sd(x); if(x==1)is[i][j]=is[j][i]=1; } } puts("!"); rep(i,1,n)rep(j,i+1,n)if(is[i][j])pdd(i,j); }