枚举每一个连续的K的第一个位置,如果是先手胜利,那么前[1 , i-1 ]和[ i+k , n ]区间要么全是0,要么全是1

如果能够平局,那么肯定是[1,i-1],以及[ i+k , n]中有两种情况

有一个区间全为0,并且另外有个区间内部最左边的1和最右边的1距离是大于K

有一个区间全为1,并且另外有一个区间内部最左边的0和最右边的0的距离是大于K

或者两个区间均有1或者均有0

如何后手胜利,那么肯定没有平局出现,也就意味着

有一个区间全为0,并且另外有个区间内部最左边的1和最右边的1距离是大于K

有一个区间全为1,并且另外有一个区间内部最左边的0和最右边的0的距离是大于K

由于不带修改,我们可以很简单维护i位置

左边第一次出现1的位置,左边第一次出现0的位置

右边第一次出现1的位置,右边第一次出现0的位置

然后o(n)判断即可,这也算是比较优秀的做法了吧。。。

#include<iostream>
#include<string.h>
#include<algorithm>
#include<stdio.h>
using namespace std;
const int maxx = 2e5+;
int l1[maxx];
int l0[maxx];
int r1[maxx];
int r0[maxx];
char s[maxx];
int main(){
int n,k;
while(~scanf("%d%d",&n,&k)){
scanf("%s",s+);
for (int i=;i<=n;i++){
if (s[i]==''){
l1[i]=i;
l0[i]=l0[i-];
}else {
l0[i]=i;
l1[i]=l1[i-];
}
}
r0[n+]=n+;
r1[n+]=n+;
for (int i=n;i>=;i--){
if (s[i]==''){
r1[i]=i;
r0[i]=r0[i+];
}else {
r0[i]=i;
r1[i]=r1[i+];
}
}
int flag=;
for (int i=;i<=n-k+;i++){
int ll=;
int lr=i-;
int rl=i+k;
int rr=n;
if(l1[i-]== && r1[i+k]==n+){
flag=min(flag,);
}
if(l0[i-]== && r0[i+k]==n+){
flag=min(flag,);
}
if (l1[i-]== && l0[n]-r0[i+k]+<=k){
flag=min(flag,);
}
if (l0[i-]== && l1[n]-r1[i+k]+<=k){
flag=min(flag,);
}
if (r0[n+k]== && l1[i-]-r1[]+<=k){
flag=min(flag,);
}
if (r1[n+k]== && l0[i-]-r0[]+<=k){
flag=min(flag,);
}
if (r1[n+k]== && l0[i-]-r0[]+>k){
flag=min(flag,);
}
if (r0[n+k]== && l1[i-]-r1[]+>k){
flag=min(flag,);
}
if (l1[i-]== && l0[n]-r0[i+k]+>k){
flag=min(flag,);
}
if (l0[i-]== && l1[n]-r1[i+k]+>k){
flag=min(flag,);
}
if (l1[i-]!= && r1[i+k]!=n+){
flag=min(flag,);
}
if (l0[i-]!= && r0[i+k]!=n+){
flag=min(flag,);
}
}
if (flag==){
printf("tokitsukaze\n");
}else if (flag==){
printf("once again\n");
}else {
printf("quailty\n");
}
}
return ;
}

C. Tokitsukaze and Duel 前缀维护的更多相关文章

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

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

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

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

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

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

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

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

  5. Codeforces 1190C. Tokitsukaze and Duel

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

  6. Codeforces 1190C Tokitsukaze and Duel game

    题意:有一个长为n的01串,两个人轮流操作,每个人可以把某个长度为m的区间变成相同颜色,谁在操作后整个串颜色相同就赢了.问最后是谁赢?(有可能平局) 思路:容易发现,如果第一个人不能一击必胜,那么他就 ...

  7. hdu 6794 Tokitsukaze and Multiple 前缀和思想+思维

    题意: t组输入,给你一个长度为n的数组,你每次可以从数组中找到a[i]和a[i+1],然后用a[i]+a[i+1]这个新元素来覆盖掉a[i]和a[i+1]的位置(1<=i<n),从而数组 ...

  8. Codeforces Round #573 (Div. 1)

    Preface 军训终于结束了回来补一补之前的坑发现很多题目题意都忘记了 这场感觉难度适中,F由于智力不够所以弃了,E的话石乐志看了官方英文题解才发现自己已经胡了一大半就差实现了233 水平下降严重. ...

  9. Codeforces Round #573 (Div. 2)

    A:Tokitsukaze and Enhancement 当时看错条件了..以为A>C>B>D.就胡写了判断条件. #include<bits/stdc++.h> us ...

随机推荐

  1. springmvc 使用了登录拦截器之后静态资源还是会被拦截的处理办法

    解决办法 在拦截器的配置里加上静态资源的处理 参考https://www.jb51.net/article/103704.htm

  2. SSH 框架controller向jsp传递List jsp中使用el表达式获取

    mvc可以使用ModelAndViev传递数据选择跳转的视图 controller中的代码, 把一个模拟的表单studentListSimulate传给ModelAndView @RequestMap ...

  3. drf作业01

    api\urls from django.conf.urls import url from . import views urlpatterns = [ url(r'^cars/$',views.C ...

  4. 学习Python笔记---列表简介

    列表: 列表由一系列按特定顺序排列的元素组成.你可以创建包涵字母表中所有字母.数字0-9或所有家庭成员姓名的列表:也可以将任何东西加入列表中,其中的元素之间可以没有任何关系. 列表 在Python中, ...

  5. JavaScript 对象的所有方法名称转换为大写

    function A() { this.do1 = function () { console.log(1); }; this.do2 = function () { console.log(2); ...

  6. Linux下安装ssdb

    安装ssdb wget --no-check-certificate https://github.com/ideawu/ssdb/archive/master.zip unzip master cd ...

  7. TypeScript高级类型

    交叉类型 将多个类型合并成一个类型,去两个类型的并集.与继承的区别是,继承可以有自己的属性,而交叉没有. interface DogInterface { run():void } interface ...

  8. C++11中的并发

    在 C++98 的时代,C++标准并没有包含多线程的支持,人们只能直接调用操作系统提供的 SDK API 来编写多线程程序,不同的操作系统提供的 SDK API 以及线程控制能力不尽相同.到了 C++ ...

  9. OSGi教程:Framework Namespaces Specification

    此教程基于OSGi Core Release 7 OSGi命名空间规范 详细的教程上面的英文教程里面有详细说明. 我就记录一下自己看完之后的简单理解: OSGi的Namespace规范就是规定了你Ma ...

  10. 制作ACK集群自定义节点镜像的正确姿势

    随着云原生时代的到来,用户应用.业务上云的需求也越来越多,不同的业务场景对容器平台的需求也不尽相同,其中一个非常重要的需求就是使用自定义镜像创建ACK集群. ACK支持用户使用自定义镜像创建Kuber ...