BZOJ 2217: [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”。
显然,这个序列最多只有 $O(n)$ 级别的取值.
有一个小性质:任何一个小于等于 $n$ 的 $q$ 肯定能被一个前缀或者一个前缀减去 $1$ 来表示出来.
对于直接可以被一个前缀表示来的 $l,r$ 好处理,现在考虑如何处理被一个前缀减去 $1$ 的情况.
想让值减小 $1,$ 其实就是将一个 $2$ 替换成 $1$.
令 $len[i]$ 表示第 $i$ 位开始极长连续 $2$ 的长度(包括自己).
如果 $len[i]>len[1]$,那么可以将 $len[1]$ 这部份的 $2$ 直接移接到 $i$ 后,然后取到 $len[1]+1$ 的 $1.$
如果 $len[1]>=len[i]$,那么可以将 $len[i]$ 这部分的 $2$ 移接到 $1$ 后,然后取道 $i+len[i]+1$ 处的 $1$. 当然,这个的前提是 $len[i]<n-i+1$.
// luogu-judger-enable-o2
#include <bits/stdc++.h>
using namespace std;
void setIO(string s) {
string in=s+".in";
freopen(in.c_str(),"r",stdin);
}
const int maxn=1000005;
char str[maxn];
int a[maxn],L[maxn<<1],R[maxn<<1],len[maxn];
int main() {
// setIO("input");
int n,m;
scanf("%d%d",&n,&m);
scanf("%s",str+1);
for(int i=1;i<=n;++i) {
if(str[i]=='T') a[i]=2;
else a[i]=1;
}
for(int i=n;i>=1;--i) len[i]=a[i]==2?(len[i+1]+1):0;
int Sum=0;
for(int i=1;i<=n;++i) {
Sum+=a[i];
L[Sum]=1,R[Sum]=i;
if(a[i]==2) {
if(len[i]>len[1]) L[Sum-1]=len[1]+2,R[Sum-1]=i+len[1];
else if(len[i]!=n-i+1) R[Sum-1]=i+len[i],L[Sum-1]=len[i]+1;
}
}
while(m--){
int k;
scanf("%d",&k);
if(L[k]) printf("%d %d\n",L[k],R[k]);
else printf("NIE\n");
}
return 0;
}
BZOJ 2217: [Poi2011]Lollipop 构造 + 思维的更多相关文章
- bzoj 2217 [Poi2011]Lollipop 乱搞 贪心
2217: [Poi2011]Lollipop Time Limit: 15 Sec Memory Limit: 64 MBSec Special JudgeSubmit: 383 Solved ...
- BZOJ 2217: [Poi2011]Lollipop
若sum可行 sum-2一定可行 序列和为ans 找出和ans奇偶性不同的最大的ans,即最靠左或最靠右的1的位置 更新答案 有spj #include<cstdio> using nam ...
- bzoj 2530 [Poi2011]Party 构造
2530: [Poi2011]Party Time Limit: 10 Sec Memory Limit: 128 MBSec Special JudgeSubmit: 364 Solved: ...
- BZOJ2217 Poi2011 Lollipop 【思维+模拟】
Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T"). 现在有m个询问,每个询问是询问有没有一个 ...
- 【BZOJ2217】[Poi2011]Lollipop 乱搞
[BZOJ2217][Poi2011]Lollipop Description 有一个长度为n的序列a1,a2,...,an.其中ai要么是1("W"),要么是2("T& ...
- BZOJ 2530 Poi2011 Party 【枚举】
BZOJ 2530 Poi2011 Party Description Byteasar intends to throw up a party. Naturally, he would like i ...
- [bzoj 2216] [Poi2011] Lightning Conductor
[bzoj 2216] [Poi2011] Lightning Conductor Description 已知一个长度为n的序列a1,a2,-,an. 对于每个1<=i<=n,找到最小的 ...
- bzoj 2528: [Poi2011]Periodicity【kmp+构造】
神仙构造,做不来做不来 详见:http://vfleaking.blog.163.com/blog/static/174807634201329104716122/ #include<iostr ...
- Luogu3514 POI2011 Lollipop 递推、构造
题目传送门:https://www.luogu.org/problemnew/show/P3514 题意:给出一个只有$1$和$2$的长度为$N$的数列,$M$次询问是否存在一段连续子区间和为$K$. ...
随机推荐
- JAVA 编程思想一
1: 动态绑定和静态绑定 使用private或static或final修饰的变量或者方法,使用静态绑定.而虚方法(可以被子类重写的方法)则会根据运行时的对象进行动态绑定: 静态绑定使用类信息来完成,而 ...
- python 基础复习
1.简述cpu.内存.硬盘的作用 cpu (1)cpu:处理逻辑运算.算术运算 (2)cpu:接受指令传给电脑硬件,让其运行 内存: (1)内存:从硬盘中读取数据,供其cpu调取指令运行,短暂的存贮数 ...
- 2017.9.23 C组比赛总结
今天又回到了C组,感觉爽歪歪~分数终于是个三位数了,yes! 第一题,赛车.水!只用一个贪心就可以AC了. first,以速度为关键字小到大qsort一下... scond,枚举每一个赛车,看看它可以 ...
- python中对多态和多态性的理解
python中对多态的理解 一.多态 多态是指一类事物有多种形态,比如动物类,可以有猫,狗,猪等等.(一个抽象类有多个子类,因而多态的概念依赖于继承) import abc class Animal( ...
- jmeter的三种参数化方法
JMeter的三种参数化方式包括: 1.用户参数 2.函数助手 3.CSV Data Set Config 一.用户参数 位置:添加-前置处理器-用户参数 操作:可添加多个变量或者参数 二.函数助手 ...
- js 判断图片和视频是否加载成功
图片: 失败: // 方法 1:更换图片地址 $('img').error(function(){ $(this).attr('src', '加载失败.png'); }); // 方法 2:隐藏它 $ ...
- SQL注入的一些技巧分享
先上一道简单的ctf注入题: 一道利用order by进行注入的ctf题 很不错的一道利用order by的注入题,之前不知道order by除了爆字段还有这种操作. 原题地址:http://chal ...
- 响应式前端框架Bootstrap系列(11)分页
分页功能已经封装成一个独立的js文件,也是用bs完成的,名称为bootstrap-paginator.js. 使用前先导入文件 : <script src="../libs/boots ...
- 传输层协议之TCP/UDP
1.UDP UDP协议是面向无连接的,即不需要在正式传递数据前先链接双方,UDP协议只是数据报文的搬运工,不保证有序且不丢失的传递到对端,且UDP协议无任何控制流量的算法,UDP相对于TCP更加轻便. ...
- OneDrive高速下载链接分享
目录 1. 下载帮助 2. 本文地址 3. 资源链接 4. 打赏&支持 5. 关于&联系我 1. 下载帮助 OneDrive下载教程,建议不了解的先看下: https://www.cn ...