【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. eclipse一直卡住,出现 “android sdk content loader 0%” 卡住的错误分析及解决方法...
  2. 如何分析802.11协议中的BA帧(block acknowledgement)
  3. 【PAT笔记】PAT中的散列思想
  4. docker删除本地已下载的镜像
  5. JPA JoinColumn vs mappedBy
  6. 为托管应用程序添加DPI Aware支持
  7. spark学习-33-Spark安全机制SecurityManager
  8. linux信任主机建立不了,openssh主机间信任关系建立
  9. English Voice of Way Back Into Love
  10. JavaEE 支付宝支付
  11. 360安全卫士加速球误关闭某个应用软件
  12. MODIS数据批量下载工具
  13. swfobject的使用
  14. u盘启动盘制作工具多个linux,多系统U盘启动盘制作工具
  15. 2021年中国理财产品行业之新发行银行理财产品概览,中国银行发行2359只,位居榜首「图」
  16. 关于数据库工作方面的一些感悟
  17. SpringCloud入门之项目实例
  18. 【《Real-Time Rendering 3rd》 提炼总结】(一) 全书知识点总览
  19. MBP远程控制Windows NUC
  20. Linux命令之shred命令

热门文章

  1. 耽美是女性调节大脑反应的潜在性吸引力
  2. Unity WebGL开发
  3. photoshop基础学习之绘制耐克图标(循序渐进)
  4. 轻松利用frp搭建代理,socket5,端口映射,远程桌面控制
  5. 磨金石教育摄影干货分享|怎样拍出唯美有内涵的“中国风”照片
  6. STM32学习笔记之—红外通信
  7. 三十四 我在软件园的那些日子里
  8. angularjs中的依赖注入
  9. nightwatch编写测试
  10. Activity生命周期回调方法