题意:有一个长为n的01串,两个人轮流操作,每个人可以把某个长度为m的区间变成相同颜色,谁在操作后整个串颜色相同就赢了。问最后是谁赢?(有可能平局)

思路:容易发现,如果第一个人不能一击必胜,那么他就会向平局发展。同理,如果第二个人不能在第一个人的所有第一步的可能走法之后都能一击必胜,那么他也会向平局发展。所有,问题转化为了第一个人能不能一击必胜,第二个人能不能在第一步的所有走法之后一击必胜。

先考虑第一个人,我们只要判断能不能找到一个区间,使得这个区间的颜色相同之后,向左右延伸可以到串的两端即可。设当前枚举的区间是[l, r],如果s[l - 1]和s[r + 1]颜色相同,并且s[l - 1]向左延伸可以到1,s[r + 1]向右延伸可以到n,那么就找到了一个必胜区间。

现在考虑对于每个第一步,第二个人能不能必胜。还是假设第一步覆盖的区间是[l, r],那么如果l - 1和r + 1有一个不能延伸到端点,第二个人就不可能必胜(l = 1和r = n的情况除外)。如果都可以延伸到两端,那么s[l - 1]和s[r + 1]一定不同。那么只有1到l - 1和 r + 1到n都小于等于m才行,即无论你选什么颜色,我都可以把剩下的颜色不一样的部分变成一样的,这样必胜情况 + 1。l = 1和r = n的情况同理,特判一下即可。最后,看一下第一步方案数和必胜数是否一样即可。

代码:

#include <bits/stdc++.h>
using namespace std;
const int maxn = 100010;
char s[maxn];
int l[maxn], r[maxn];
int n, m;
int main() {
scanf("%d%d", &n, &m);
scanf("%s", s + 1);
l[0] = 1;
for (int i = 1; i <= n; i++) {
if(s[i] == s[i - 1]) l[i] = l[i - 1];
else l[i] = i;
}
r[n + 1] = n;
for (int i = n; i >= 1; i--) {
if(s[i] == s[i + 1]) r[i] = r[i + 1];
else r[i] = i;
}
if(r[1] == n) {
printf("tokitsukaze\n");
return 0;
}
int cnt = 0;
for (int l1 = 1, r1 = m; r1 <= n; l1++, r1++) {
if(l[l1 - 1] == 1 && r[r1 + 1] == n) {
if(l1 == 1 || r1 == n || (s[l1 - 1] == s[r1 + 1])) {
printf("tokitsukaze\n");
return 0;
} else {
if(l1 - 1 <= m && n - r1 <= m) cnt++;
}
} else if(l1 == 1) {
if(n - r1 <= m) cnt++;
} else if(r1 == n) {
if(l1 - 1 <= m) cnt++;
}
}
if(cnt == n - m + 1) printf("quailty\n");
else printf("once again\n");
}

  

Codeforces 1190C Tokitsukaze and Duel game的更多相关文章

  1. Codeforces 1190C. Tokitsukaze and Duel

    传送门 注意到后手可以模仿先手的操作,那么如果一回合之内没法决定胜负则一定 $\text{once again!}$ 考虑如何判断一回合内能否决定胜负 首先如果最左边和最右的 $0$ 或 $1$ 距离 ...

  2. Codeforces - 1191E - Tokitsukaze and Duel - 博弈论 - 尺取

    https://codeforc.es/contest/1191/problem/E 参考自:http://www.mamicode.com/info-detail-2726030.html 和官方题 ...

  3. [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论)

    [Codeforces 1191D] Tokitsukaze, CSL and Stone Game(博弈论) 题面 有n堆石子,两个人轮流取石子,一次只能从某堆里取一颗.如果某个人取的时候已经没有石 ...

  4. E - Tokitsukaze and Duel CodeForces - 1190C (博弈 + 窗体移动)

    "Duel!" Betting on the lovely princess Claris, the duel between Tokitsukaze and Quailty ha ...

  5. Codeforces Round #573 (Div. 2) E. Tokitsukaze and Duel (博弈)

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. Tokitsukaze and Duel CodeForces - 1191E (博弈论)

    大意: 给定01串, 两人轮流操作, Tokitsukaze先手. 每次操作可以选择长为$k$的区间, 全部替换为$0$或$1$, 若替换后同色则赢. 求最后结果. 先判断第一步是否能直接赢, 不能的 ...

  7. Codeforces - 1191F - Tokitsukaze and Strange Rectangle - 组合数学 - 扫描线

    https://codeforces.com/contest/1191/problem/F 看了一下题解的思路,感觉除了最后一段以外没什么启发. 首先离散化x加快速度,免得搞多一个log.其实y不需要 ...

  8. Codeforces - 1191C - Tokitsukaze and Discard Items - 模拟

    https://codeforces.com/contest/1191/problem/C 一开始想象了一下,既然每次删除都是往前面靠,那么好像就是页数*页容量+空位数=最多容纳到的坐标. 至于为什么 ...

  9. Codeforces - 1191B - Tokitsukaze and Mahjong - 模拟

    https://codeforces.com/contest/1191/problem/B 小心坎张听的情况. #include<bits/stdc++.h> using namespac ...

随机推荐

  1. HTML基础 内联样式改进 三毛语录

    <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <title> ...

  2. Tomcat 9 安装

    1.下载 官网:https://tomcat.apache.org/ 在浏览器地址栏输入地址,进入下图页面. 点击下图红色标记处(笔者选择的Tomcat 9下载,读者可根据需要自行选择) 下图蓝色标记 ...

  3. Go 迭代切片

    迭代切片有两种方式: 1. 使用 for range 迭代切片   // 其长度和容量都是 4 个元素 slice := [], , , } // 迭代每一个元素,并显示其值 for index, v ...

  4. bzoj4922 [Lydsy1706月赛]Karp-de-Chant Number 贪心+背包

    题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=4922 题解 记录每一个串的没有匹配的右括号 \()\) 的数量为 \(a_i\),为匹配的左括 ...

  5. Maven 错误: Unknown lifecycle phase ".sourceforge.javacsv". You must specify a valid lifecycle phase or a goal

    这是在Win10系统下,将Jar包手工导入进Maven本地仓库,使用PowerShell执行命令报的错. 命令如下: mvn install:install-file -Dfile=E:\Worksp ...

  6. iOS项目开发中的知识点与问题收集整理①

    前言部分 注:本文并非绝对原创 大部分内容摘自 http://blog.csdn.net/hengshujiyi/article/details/20943045 文中有些方法可能已过时并不适用于现在 ...

  7. 【leetcode】336. Palindrome Pairs

    题目如下: 解题思路:对于任意一个word,要找出在wordlist中是否存在与之能组成回文的其他words,有两种思路.一是遍历wordlist:二是对word本身进行分析,找出能组成回文的word ...

  8. 如何保留小数点后N位?

    2014年10月17日09:48:39 在做项目中遇到的,要把想显示的数据进行规定小数位的保留,下面写一下用过的方法: 1. BigDecimal 方法(我做项目的时候用的方法) 代码: java.m ...

  9. nboot,eboot和uboot

    nboot,eboot和uboot三者均为bootloader. ----nboot是samsung系列cpu为了能将前4KB程序复制到SRAM中运行,而在wince写的.nboot很小(4k左右), ...

  10. Linux sudo 详解

    简单的说,sudo 是一种权限管理机制,管理员可以授权于一些普通用户去执行一些 root 执行的操作,而不需要知道 root 的密码.严谨些说,sudo 允许一个已授权用户以超级用户或者其它用户的角色 ...