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\n");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\n",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);
}