题解:CF2261F1 Plegma II: Ask Me Any Cell (Easy Version)

· · 题解

先考虑 $1\times n$ 的情况下怎么做。 首先有一个很 naive 的想法:将其强行分隔为 `11..111000..000` 的形式,再看是否有 `1`,有 `1` 删左边,否则删右边。 然后我们发现这样子完全没必要,有 `1` 与否只需要有 $1$ 个 `1` 即可,于是我们将其改为 `00000...100000000` 的形式。 接下来考虑如何扩展到 $n\times n$,由于 $k=24$,所以说我们还剩下 $4$ 个 `0`,考虑使用某种东西来存储到底应该删上面还是下面。 我们先想出一个理想的情况,在刚好删完目标点上面一排后状态就会改变,而且只需要删除很少个 `0` 就能改变。 没错,这个状态就是奇偶性。 于是我们考虑根据奇偶性决定删除上面还是下面,在目标点上面一排放上一个 `0`,下面根据整体奇偶性决定是否放 `0`,然后就做完了。 # Code 代码有点丑。 ```cpp #include<bits/stdc++.h> using namespace std; #define int long long string s[28]={"","111","111","001","011","111","100","110","110","110","010","111","111","111","111","111","010","111","101","111","111","110","111","011","111","011","010","111"}; int ans[25][25]; void solve(int r,int c) { memset(ans,0,sizeof(ans)); //for(int i=1;i<c;i++) //{ // ans[r][i]=1; //} ans[r][c-1]=1; for(int i=1;i<r;i++) { for(int j=1;j<=20;j++) { ans[i][j]=1; } } ans[r-1][1]=0; if(c!=1&&r==20) { ans[r-1][1]=1; } for(int i=r+1;i<=20;i++) { for(int j=1;j<=20;j++) { ans[i][j]=1; } } ans[r+1][1]=((c==1))&1; for(int i=1;i<=20;i++) { for(int j=1;j<=20;j++) { printf("%lld",ans[i][j]); } printf("\n"); } printf("\n"); } signed main() { int n; scanf("%lld",&n); if(n==3) { for(int i=1;i<=27;i++) { cout<<s[i]<<"\n"; if(i%3==0) { printf("\n"); } } printf("DURLDULRUU"); } else { //solve(1,3); for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { solve(i,j); } } printf("RL"); for(int i=2;i<n;i++) { printf("U"); } for(int i=n;i<=n*n;i++) { if(i&1) { printf("U"); } else { printf("D"); } } } return 0; } ```