CodeForces 1190C Tokitsukaze and Duel
作者:互联网
一道不错的博弈论。
思路
此题的关键性质在于:一方可以重复另一方上一次的操作从而使得局面不变。
因此有结论:先手必胜当且仅当先手第一步就取胜,后手必胜当且仅当先手无法在第一步就取胜且无论先手如何操作后手都能一步胜利。
可以这么理解。若先手第一步无法取胜,后手下一步就有取胜策略则执行,否则后手可以重复先手的操作,使先手面对这个无法一步取胜的局面。 同理后手若无法在第一步取胜那么先手也可以重复后手的操作。
接下来首先要判断先手能否第一步取胜。只要存在区间 \([i,i+m-1]\) 满足 \(i \ge 1,i+m-1 \le n\) 且 \([1,i-1]\) 和 \([i+m,n]\) 的值相同(或者为空)则先手能第一步取胜。实现时前缀和判断即可。
然后判断后手能否第一步取胜。枚举先手第一步选的区间 \([i,i+m-1]\),如果对于每一个 \(i\) 均 满足:
- \([1,i-1]\) 的值都相等
- \([i+m,n]\) 的值都相等且不与 \([1,i-1]\) 的值相等(如果相等就先手必胜了;两个区间内的值都要分别相等是因为后手不能预测先手选的区间,所以两个区间都有需要被染色的可能)
- \([1,i-1]\) 和 \([i+m,n]\) 的区间长度均 \(\le m\)(这样就保证无论先手将 \([i,i+m-1]\) 染成什么颜色,都可以完整地选出一个区间并染成先手染的颜色)
则后手就能必胜。实现时这部分仍然可以前缀和判断。注意要特判 \(i=1\) 和 \(i=n-m+1\) 的情况。
代码
code
/*
p_b_p_b txdy
AThousandSuns txdy
Wu_Ren txdy
Appleblue17 txdy
*/
#include <bits/stdc++.h>
#define pb push_back
#define fst first
#define scd second
#define mems(a, x) memset((a), (x), sizeof(a))
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef pair<ll, ll> pii;
const int maxn = 100100;
int n, m, sum[maxn][2];
char s[maxn];
int query(int l, int r, int k) {
return sum[r][k] - sum[l - 1][k];
}
void solve() {
scanf("%d%d%s", &n, &m, s + 1);
for (int i = 1; i <= n; ++i) {
for (int j = 0; j <= 1; ++j) {
sum[i][j] = sum[i - 1][j] + (s[i] == ('0' + j));
}
}
for (int i = 1; i + m - 1 <= n; ++i) {
for (int j = 0; j <= 1; ++j) {
if (query(1, i - 1, j) == i - 1 && query(i + m, n, j) == n - i - m + 1) {
puts("tokitsukaze");
return;
}
}
}
for (int i = 1; i + m - 1 <= n; ++i) {
if (i == 1) {
if (n - i - m + 1 > m) {
puts("once again");
return;
}
continue;
} else if (i + m - 1 == n) {
if (i - 1 > m) {
puts("once again");
return;
}
continue;
}
bool flag = 0;
for (int j = 0; j <= 1; ++j) {
if (query(1, i - 1, j) == i - 1 && query(i + m, n, j ^ 1) == n - i - m + 1 && i - 1 <= m && n - i - m + 1 <= m) {
flag = 1;
break;
}
}
if (!flag) {
puts("once again");
return;
}
}
puts("quailty");
}
int main() {
int T = 1;
// scanf("%d", &T);
while (T--) {
solve();
}
return 0;
}
标签:1190C,Duel,int,第一步,CodeForces,long,先手,typedef,取胜 来源: https://www.cnblogs.com/zltzlt-blog/p/16503354.html