[POI2011]LIZ-Lollipop
https://www.zybuluo.com/ysner/note/1303462
题面
给一个只有\(1\)和\(2\)的序列,每次询问有没有一个子串的和为\(x\)。
- \(n\leq10^6\)
解析
一道挺不错的思维题。
只有\(1\)和\(2\)的性质其实很妙。这意味着大多数的\(x\)都是存在的。
先预处理前缀和。
如果当前\(x\)不是某一前缀和,那么\(x+1\)一定是某一前缀和。(因为\(x\)不为前缀和当且仅当\(s_{i-1}=x-1,a_i=2\))
那么我们可以利用一下前缀和为\(x+1\)的区间来得到所求区间。
显然我们需要在左端或右端删掉一个\(1\)。
可以预处理一下每个点右边最近的\(1\)在哪里。
然后两边向右跳同样的距离即可(让一边删掉一个\(1\),另一边没删)。
注意一下边界,问题就解决了。
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
#include<algorithm>
#define ll long long
#define re register
#define il inline
#define fp(i,a,b) for(re int i=a;i<=b;++i)
#define fq(i,a,b) for(re int i=a;i>=b;--i)
using namespace std;
const int N=2e6+100;
int las[N],n,m,a[N],pos[N];
char s[N];
il ll gi()
{
re ll x=0,t=1;
re char ch=getchar();
while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
if(ch=='-') t=-1,ch=getchar();
while(ch>='0'&&ch<='9') x=x*10+ch-48,ch=getchar();
return x*t;
}
int main()
{
n=gi();m=gi();
scanf("%s",s+1);
fp(i,1,n) a[i]=a[i-1]+(s[i]=='W'?1:2),pos[a[i]]=i;
fq(i,n,1) if(s[i]=='T') las[i]=las[i+1]+1;
while(m--)
{
re int x=gi();
if(x>a[n]) puts("NIE");
else if(pos[x]) printf("%d %d\n",1,pos[x]);//x+1一定存在
else if(las[pos[x+1]]>las[1]) printf("%d %d\n",2+las[1],pos[x+1]+las[1]);//前面删1(记得是1~1+las[1]删了,所以从1+las[1]+1开始)
else if(las[pos[x+1]]+pos[x+1]<=n) printf("%d %d\n",1+las[pos[x+1]],pos[x+1]+las[pos[x+1]]);//后面删1
else puts("NIE");
}
return 0;
}
[POI2011]LIZ-Lollipop的更多相关文章
- bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
2217: [Poi2011]Lollipop Time Limit: 15 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 383 Solved ...
- 【BZOJ2217】[Poi2011]Lollipop 乱搞
[BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...
- Luogu3514 POI2011 Lollipop 递推、构造
题目传送门:https://www.luogu.org/problemnew/show/P3514 题意:给出一个只有$1$和$2$的长度为$N$的数列,$M$次询问是否存在一段连续子区间和为$K$. ...
- BZOJ2217 : [Poi2011]Lollipop
若能得到一个和为t的区间,那么至少去掉两端点中任意一个后必定能得到和为t-2的区间. 所以只需要分别找到和最大的和为奇数和偶数的区间,然后$O(n)$完成构造即可. #include<cstdi ...
- BZOJ2217 [Poi2011]Lollipop 【贪心】
题目链接 BZOJ2217 题解 如果只判定存不存在方案的话,我倒是想到可以将\(2\)拆成两个\(1\),其中一个不能作为区间开头,线段树优化计算补集方案数 但是一看这道题要输出方案啊,,, 怎么办 ...
- BZOJ2217 Poi2011 Lollipop 【思维+模拟】
Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T"). 现在有m个询问,每个询问是询问有没有一个 ...
- BZOJ 2217: [Poi2011]Lollipop
若sum可行 sum-2一定可行 序列和为ans 找出和ans奇偶性不同的最大的ans,即最靠左或最靠右的1的位置 更新答案 有spj #include<cstdio> using nam ...
- BZOJ 2217: [Poi2011]Lollipop 构造 + 思维
Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T").现在有m个询问,每个询问是询问有没有一个连 ...
- BZOJ2527: [Poi2011]Meteors
补一发题解.. 整体二分这个东西,一开始感觉复杂度不是很靠谱的样子 问了po姐姐,说套主定理硬干.. #include<bits/stdc++.h> #define ll long lon ...
- Liz Murray成功故事的偶然与必然(转)
偶尔,我看到了一部电影:Homeless to Harvard (风雨哈佛路) 说句老实话,她( Liz Murray 莉丝·默里 )的经历确实让人钦佩和学习! 下面我看到他人写的有这本电影的评论,觉 ...
随机推荐
- find -print0和xargs -0原理及用法
平常我们经常把find和xargs搭配使用,例如: find . -name "*.txt" | xargs rm 但是这个命令如果遇到文件名里有空格或者换行符,就会出错.因为xa ...
- python3.x Day5 subprocess模块!!
subprocess模块: # subprocess用来替换多个旧模块和函数 os.system os.spawn* os.popen* popen2.* commands.* subprocess简 ...
- HashTable的C++实现
由哈希表的定义,采用C++完成了一个学生成绩存储系统,分析过程如下: 由于哈希表是按KEY值存储,我们假设KEY值为一个字符串.hash算法为字符串的前两位大写字母所对应的数字对一个质数的模运算. i ...
- python3爬虫-爬取58同城上所有城市的租房信息
from fake_useragent import UserAgent from lxml import etree import requests, os import time, re, dat ...
- Wireshark抓包工具的简单使用2(抓包、查看、过滤)
在简单了解了Wireshark的界面以及各工具栏的作用后,也要掌握如何进行抓包,查询,过滤等操作 一.抓包 1.打开软件,初始界面 2.点击Caputre-->Interfaces,出现当前所有 ...
- HDU 5420 Victor and Proposition
Victor and Proposition Time Limit: 6000ms Memory Limit: 524288KB This problem will be judged on HDU. ...
- 九度oj 题目1068:球的半径和体积
题目1068:球的半径和体积 时间限制:1 秒 内存限制:32 兆 特殊判题:否 提交:6148 解决:2269 题目描述: 输入球的中心点和球上某一点的坐标,计算球的半径和体积 输入: 球的中心点和 ...
- 添物不花钱学JavaEE(基础篇)- Tomcat
Tomcat是大家常用的Java Web容器. 添物网使用的也是Tomcat. 官方网址: http://tomcat.apache.org/ 官方文档看看. 可以看的图书 <Tomcat权威指 ...
- 【转】Java IO流 overview
Java流操作有关的类或接口: Java流类图结构: 流的概念和作用 流是一组有顺序的,有起点和终点的字节集合,是对数据传输的总称或抽象.即数据在两设备间的传输称为流,流的本质是数据传输,根据数据传输 ...
- kibana启动--nohup在关闭终端后无效&&守护进程详解
https://blog.csdn.net/ty_0930/article/details/70184705 https://blog.csdn.net/Dream_Flying_BJ/article ...