题意

给定一个由1和2组成的序列,多次询问是否存在一个区间满足区间和=x

分析

结论:假如存在一个子串和为x,那么一定存在一个前缀,和为x或x+1

证明:可以认为原串是由和为x的串在开头和结尾添加若干数得到,再后边添加数不会对产生和为x或x+1的前缀产生影响,所以只考虑在前边添加数,认为后边多余的数可以删掉

若原来是一个和为x或x+1的串,那么如果在前边添加的数和最后一个数相等,去掉最后一个数之后依然是一个和为x或x+1的串

考虑新添加的数和最后的数不同的情况

若原来和为x,在前边添加1,那么这就变成了和为x+1的串;再前边添加2,把结尾的1去掉,则变成了和为x+1的串

若原来和为x+1,在前边添加1,把后边的2删掉,就变成了和为x的串;在前边添加2,把结尾的1去掉之后,若新的结尾是1,把1去掉之后变成和为x+1的串,若新的结尾是2,把2去掉之后变为和为x的串。一定存在新的结尾,即原来串的长度不可能为1,因为串的和为x+1而最后一个数是1,并且x>0

找到和为x直接输出,找到x+1时如何找到x?

我们将1-i这一段向右移,如果找到a[l]=1||a[r]=1那么就能找到x,那么我们设置nxt[i]表示从i出发的连续2序列的长度,有以下两种情况

\(1.nxt[1]<nxt[i],l=nxt[1]+1+1,r=i+nxt[i]\)

这时候能够保证a[r]为2,而l为什么加2,因为加1的话就等于x+1,所以要再右移一位减去1,这里请思考一下

\(2.nxt[1]>=nxt[i],l=nxt[i]+1,r=nxt[i]+i,这里要保证r<=n\)

这时候a[l]为2,a[r]为1

trick

代码

#include <cstdio>
const int maxn = 1001000;
int n,m,q;
char s[maxn];
int mp[maxn<<1],l,r,nxt[maxn]; int main()
{
scanf("%d %d",&n,&m);
scanf("%s",s);
int ret=0;
for(int i=0;i<n;++i)
{
ret+=(s[i]=='W')?1:2;
mp[ret]=i+1;
}
for(int i=n-1;i>=0;--i) nxt[i+1]=(s[i]=='W')?0:nxt[i+2]+1;
while(m--)
{
scanf("%d",&q);
if(mp[q]) puts("TAK");
else if(mp[q+1])
{
int i=mp[q+1];
if(nxt[1]<nxt[i]) puts("TAK");
else if(nxt[1]>=nxt[i]&&i+nxt[i]<=n) puts("TAK");
else puts("NIE");
}
else puts("NIE");
}
return 0;
}

BZOJ2217:Lollipop的更多相关文章

  1. 【BZOJ2217】[Poi2011]Lollipop 乱搞

    [BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...

  2. BZOJ2217 [Poi2011]Lollipop 【贪心】

    题目链接 BZOJ2217 题解 如果只判定存不存在方案的话,我倒是想到可以将\(2\)拆成两个\(1\),其中一个不能作为区间开头,线段树优化计算补集方案数 但是一看这道题要输出方案啊,,, 怎么办 ...

  3. BZOJ2217 : [Poi2011]Lollipop

    若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdi ...

  4. BZOJ2217 Poi2011 Lollipop 【思维+模拟】

    Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T"). 现在有m个询问,每个询问是询问有没有一个 ...

  5. Android 5.0 Lollipop初上手体验

    在等了好几天还没有等到OTA升级提示,前天笔者给Nexus4线刷入了官方提供的Lollipop的镜像,在试用了这两天之后,现在总结下自己感觉很惊艳的地方和一些地方的吐槽.(点击图片可以查看大图) 1. ...

  6. Android(Lollipop/5.0) Material Design(六) 使用图像

    Material Design列 Android(Lollipop/5.0)Material Design(一) 简单介绍 Android(Lollipop/5.0)Material Design(二 ...

  7. bzoj 2217 [Poi2011]Lollipop 乱搞 贪心

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special JudgeSubmit: 383  Solved ...

  8. Android Lollipop 5.0 经典新特性回顾

    *Tamic 专注移动开发! 更多文章请关注 http://blog.csdn.net/sk719887916 虽然Android已到了7.0 ,但是我们还是不能忘怀视觉革命性改变的5.0,今天回顾下 ...

  9. Android(Lollipop/5.0) Material Design(二) 入门指南

    Material Design系列 Android(Lollipop/5.0)Material Design(一) 简介 Android(Lollipop/5.0)Material Design(二) ...

随机推荐

  1. lua 暂停写法

    由于lua 不支持暂停 用其他方法变相实现 -- 暂停 hock 写法 function _M.sleep(n) if n > 0 then os.execute("ping -c & ...

  2. Android命令行下蓝牙使用

    注意:此部分仅仅适用于broadcom 系列蓝牙芯片,比如RK903, AP6xxx 系列 通过su 命令切换到root 用户 1.先确认RFKILL 驱动已经载入 ls /sys/class/rfk ...

  3. nextSibling和previousSibling

    <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content ...

  4. 处理页面载入图片js(等比例压缩图片)

    第一页面html  <div class="admin">${answer.content}</div> <div class="admin ...

  5. openwrt gstreamer实例学习笔记(七. gstreamer 缓冲区(Buffers)和事件(Events))

    1)概述 管道的数据流由一组缓冲区和事件组成,缓冲区包括实际的管道数据,事件包括控制信息,如寻找信息和流的终止信号.所有这些数据流在运行的时候自动的流过管道. 2) 缓冲区(Buffers) 缓冲区包 ...

  6. Mysql整数运算NULL值处理注意点

    CleverCode近期在导出报表的时候,在整数做减法的时候,发现整数减去null得到是null.这是一个细节问题,希望大家以后注意. 1 表中的数据 total,used都是整形,同意为空. 2 有 ...

  7. 图像处理之图像格式变换和色彩增强---rgb2hsi2hsv 色彩增强

    从昨天折腾到今天.再折腾下去我都要上主楼了  大致和灰度图均衡是一样的,主要是不能像平滑什么的直接对R,G,B三个分量进行.这样出来的图像时没法看的.因此我们要对亮度进行均衡.而HSI彩色空间中的分量 ...

  8. JSP 用poi 读取Excel

    <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding= ...

  9. PM12条

    PM首先是用户 站在用户角度看待问题 用户体验是一个完整的过程 追求效果,不做没用的东西 发现需求,而不是创造需求 决定不做什么,往往比决定做什么更重要 用户是很难被教育的,要迎合用户,而不是改变用户 ...

  10. mysql优化-----多列索引的左前缀规则

    索引优化策略 :索引类型 .1B-tree索引 关注的是:Btree索引的左前缀匹配规则,索引在排序和分组上发挥的作用. 注:名叫btree索引,大的方面看都用的二叉树.平衡树.但具体的实现上,各引擎 ...