其他分享
首页 > 其他分享> > CodeForces 1190C Tokitsukaze and Duel

CodeForces 1190C Tokitsukaze and Duel

作者:互联网

洛谷传送门

CodeForces 传送门

一道不错的博弈论。

思路

此题的关键性质在于:一方可以重复另一方上一次的操作从而使得局面不变。

因此有结论:先手必胜当且仅当先手第一步就取胜,后手必胜当且仅当先手无法在第一步就取胜且无论先手如何操作后手都能一步胜利。

可以这么理解。若先手第一步无法取胜,后手下一步就有取胜策略则执行,否则后手可以重复先手的操作,使先手面对这个无法一步取胜的局面。 同理后手若无法在第一步取胜那么先手也可以重复后手的操作。

接下来首先要判断先手能否第一步取胜。只要存在区间 \([i,i+m-1]\) 满足 \(i \ge 1,i+m-1 \le n\) 且 \([1,i-1]\) 和 \([i+m,n]\) 的值相同(或者为空)则先手能第一步取胜。实现时前缀和判断即可。

然后判断后手能否第一步取胜。枚举先手第一步选的区间 \([i,i+m-1]\),如果对于每一个 \(i\) 满足:

则后手就能必胜。实现时这部分仍然可以前缀和判断。注意要特判 \(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