【BZOJ2217】[Poi2011]Lollipop

Description

有一个长度为n的序列a1,a2,...,an。其中ai要么是1("W"),要么是2("T")。
现在有m个询问,每个询问是询问有没有一个连续的子序列,满足其和为q。

Input

第一行n,m (1<=n,m<=1000000)
第二行这个序列,起始编号为1,终止编号为n
下面每行一个询问q,询问有没有一个连续的子序列,满足其和为q (1<=q<=2000000)

Output

对于每个询问,输出一行,如果有,输出这个序列的起点和终点(如果有多个输出任意一个);如果没有,输出“NIE”。

Sample Input

5 3
TWTWT
5
1
7

Sample Output

1 3
2 2
NIE

题解:非常奇怪的题。如果存在一个子串的和为x,那么一定有一个前缀的和为x或x+1(显然),如果存在一个前缀为x就已经做完了,那么我们考虑如何由一个前缀x+1得到一个子串x。

我们用类似于双指针的过程,维护指针l和r不断向右平移,如果l或r中有一个是1,那么我们将这个1扔掉就从x+1得到了x,否则l和r都是2,那么我们将整个区间整体向右平移一格,直到出现1为止。换句话说,我们可以记录对于每个位置,它后面最长的连续的2有多少个,然后将l和r整体平移那么多格。如果平移到序列末端还不行,则输出无解。

#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
const int maxn=1000010;
int n,m,sum;
int v[maxn],st[maxn<<1],l[maxn];
char str[maxn];
inline int rd()
{int ret=0,f=1;   char gc=getchar();while(gc<'0'||gc>'9')  {if(gc=='-')    f=-f;  gc=getchar();}while(gc>='0'&&gc<='9')  ret=ret*10+(gc^'0'),gc=getchar();return ret*f;
}
int main()
{n=rd(),m=rd();scanf("%s",str);int i,x,a,b;for(i=1;i<=n;i++) v[i]=(str[i-1]=='T')+1,st[sum+=v[i]]=i;for(l[n+1]=1,i=n;i>=1;i--)   l[i]=(v[i]==1)?0:l[i+1]+1;for(i=1;i<=m;i++){x=rd();if(st[x])   printf("%d %d\n",1,st[x]);else{if(!st[x+1])  puts("NIE");else{a=1+min(l[1],l[st[x+1]]),b=st[x+1]+a-1;if(b>n)  puts("NIE");else  if(v[b]==1)   printf("%d %d\n",a,b);else    printf("%d %d\n",a+1,b);}}}return 0;
}//5 9 TWTWT 1 2 3 4 5 6 7 8 9

转载于:https://www.cnblogs.com/CQzhangyu/p/7965430.html

【BZOJ2217】[Poi2011]Lollipop 乱搞相关推荐

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

    2217: [Poi2011]Lollipop Time Limit: 15 Sec  Memory Limit: 64 MBSec  Special Judge Submit: 383  Solve ...

  2. BZOJ2217 [Poi2011]Lollipop 【贪心】

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

  3. BZOJ2217 [Poi2011]Lollipop

    结论:假如存在一个子串和为x,那么一定存在一个前缀,和为x或x+1 证明:可以认为原串是由和为x的串在开头和结尾添加若干数得到,再后边添加数不会对产生和为x或x+1的前缀产生影响,所以只考虑在前边添加 ...

  4. AcWing 397. 逃不掉的路(边双连通分量缩点成树 + 树链剖分乱搞)

    整理的算法模板合集: ACM模板 我们知道在同一个边双连通分量中的点没有必经边(因为至少有两条分离的路径). 所以我们直接tarjan求出桥后缩点,然后求一下树上两点间的距离即可. 那么如何求树上两点 ...

  5. bzoj 1050: [HAOI2006]旅行comf(codevs.cn 1001 舒适的路线) 快排+并查集乱搞

    没用的话:好像很久没发博客了,主要是懒太蒟找不到水题.我绝对没弃坑...^_^ 还用些话:本文为博主原创文章,若转载请注明原网址和作者. 进入正题: 先pa网址: bzoj :http://www.l ...

  6. BZOJ-1800 飞行棋 数学+乱搞

    这道题感觉就是乱搞,O(n^4)都毫无问题 1800: [Ahoi2009]fly 飞行棋 Time Limit: 10 Sec Memory Limit: 64 MB Submit: 1172 So ...

  7. 【BZOJ-3578】GTY的人类基因组计划2 set + map + Hash 乱搞

    3578: GTY的人类基因组计划2 Time Limit: 10 Sec  Memory Limit: 128 MB Submit: 367  Solved: 159 [Submit][Status ...

  8. BZOJ4401:块的计数(乱搞)

    Description 小Y最近从同学那里听说了一个十分牛B的高级数据结构--块状树.听说这种数据结构能在sqrt(N)的时间内维护树上的各种信息,十分的高效.当然,无聊的小Y对这种事情毫无兴趣,只是 ...

  9. Luogu3732 [HAOI2017] 供给侧改革 【后缀数组】【线段树】【乱搞】

    题目分析: 这道题我是乱搞的,因为他说$01$串是随机的. 那么我们可以猜测能够让LCP变大的地方很少.求出后缀数组之后可能让LCP变大的地方就等价于从大到小往height里动态加点同时维护这个点左右 ...

最新文章

  1. 扇区、磁盘块、页、页框、缓冲区之间的关系!
  2. [NOIP2018模拟赛10.19]只会暴力报告
  3. 【RL】快速强化学习实战案例
  4. Mysql创建修改删除-表
  5. 深度学习在CTR预估中的应用 | CTR深度模型大盘点
  6. 浅谈大型网站之负载均衡架构
  7. python爬虫开发 从入门到实战_python网络爬虫从入门到实战开发
  8. 交互式多模型_论文深度提升的万金油方法——多属性决策 Ⅱ
  9. Ubuntu下Except的安装
  10. Android学习路线指南-------任玉刚
  11. 单片机怎么通过按键控制计时器的开始和停止_《搞机作战室》机械师PX780控制中心软件使用教程...
  12. 故宫景点功课10:后三宫区(中)
  13. Ueditor编辑器插入外链视频支持手机播放【iframe标签】
  14. 氢键H-H的博客目录
  15. blob是什么类型?
  16. c语言输入10个数从小,C语言中,从键盘输入10个数,从小到大排列输出,怎
  17. 网页看视频没有声音怎么办
  18. Python--Opencv:errorFindContours supports only CV_8UC1 images when mode = CV_RETR_FLOODFILL otherw
  19. 【xitongshoucang.com】全方位对Shift键大揭秘
  20. 域名升级访问中拿笔记好_赶快看看你的电脑中是否被植入了这个软件

热门文章

  1. 白金奖设计作品:给你一支笔,你便是艺术家
  2. linux expr用法
  3. transform三大属性之rotate(旋转)
  4. max_delay/min_delay和input_delay/output_delay
  5. 单机canal监听binlog
  6. 技术动态 | 利用知识图谱克服人工智能幻觉
  7. mysql排序convert_mysql里的varchar值转换为可排序的值(MySql varchar排序 CAST ,CONVERT)...
  8. java 利用阿里dns解析功能,实现ddns服务。
  9. SPICE电路仿真(3)--二极管
  10. 《哈迪斯》经济系统分析