[AGC060B] Unique XOR Path 的题解
题目大意
有一个 的网格,每个网格可以填 到 范围内的数字。现在从左上角走到右下角,每次可以选择往右边或往下走一步。如果路径上所有数字异或和为 ,称这样的路径为好路径。给定一条路径 , 表示往下走, 表示往右走。问,是否存在一个网格,使得这条路径 是唯一的好路径。
思路
考虑用最少的数字填完整个表格,假设数字范围为 到 ,只要 ,就满足情况,否则不满足情况。
对于给定的路线 ,异或和为 ,可以将路径上所有位置全部设置为 。
考虑在路线 变化 步的路线,也就是拐角处。为了让这些路线异或和不为 ,分别填 ,同时在同一条斜线上填同样的数字,其余位置填 。这样保证你只要走了路线 之外的线路,在最终的异或和上都会出现新的 。
但这样不是最优的,可以发现,如果出现连续的 个拐弯, 个拐角可以填相同的数字。
同理可以模拟出 个连续的拐角需要 个不同的数字,
个连续的拐角需要 个不同的数字,如果有 个连续的拐角,那么 个不同的数组。
时间复杂度为 。
AC Code
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=105;
int n,m,k;
char a[N];
void solve(){
cin>>n>>m>>k>>a+1;
for(int i=1;i<n+m-2;i++) if(a[i]!=a[i+1]) i++,k--;
if(k>=0) cout<<"Yes\n";
else cout<<"No\n";
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(nullptr);
int T;
cin>>T;
while(T--){
solve();
}
return 0;
}