牛客国庆训练,CCPC Camp DAY1 J 倍增,括号匹配
https://www.nowcoder.com/acm/contest/201#question
题意:中文不翻译了
解法的个人理解:
对于一个合法的区间$[L,R]$
1.显然其左括号的匹配位置都小于等于$R$,其右括号的匹配位置都大于等于$L$,
2.左括号和右括号数量相同
3.区间的长度为偶数
后面两点是必要的,但是不够充分
第一点是最关键的,我们可以考虑转化
如果将整个序列左括号所匹配的位置记录下来作为数列$a_i$,同理右括号记为$b_i$原本的询问就等于是询问一个区间最大值和区间最小值了
即$a_i$的最大值小于$R$,$b_i$的最小值小于$L$,至于具体怎么查,用st表,线段树,树状数组都行
而实际上,在满足2,3条件之后,最大值和最小值只用计算其中一个即可
例如满足了左括号的匹配位置都小于$R$,那么区间内的左括号都已经找到归属了,换句话说只要左括号和右括号数目相等,则必然合法
代码如下:
#include <bits/stdc++.h>
#define rep(ii,a,b) for(register int ii=a;ii<=b;++ii)
#define per(ii,a,b) for(register int ii=b;ii>=a;--ii)
using namespace std;
const int maxn=2e6+10,maxm=2e6+10;
int casn,n,m,k,q,a[maxn],stk[maxn];
int l[maxn],sum[maxn],st[maxn][22],top,ll,rr;
inline int rmax(int ll,int rr){
int len=0;
while(ll+(1<<len)-1<=rr) len++;
len--;
return max(st[ll][len],st[rr-(1<<len)+1][len]);
}
int main() {
scanf("%d%d%d",&n,&m,&q);
rep(i,1,n) scanf("%d",&a[i]);
rep(i,1,n)
if(a[i]%2) sum[i]=sum[i-1]-1;
else sum[i]=sum[i-1]+1;
per(i,1,n)
if(a[i]%2)stk[++top]=i;
else{
if(top&&a[i]/2==a[stk[top]]/2){
l[i]=stk[top--];
}else {
l[i]=maxn+10;
top=0;
}
}
rep(i,1,n) st[i][0]=l[i];
rep(i,1,21) rep(j,1,n)
st[j][i]=max(st[j][i-1],st[min(j+(1<<(i-1)),n)][i-1]);
while(q--){
scanf("%d%d",&ll,&rr);
if((rr-ll+1)%2==0&&sum[rr]==sum[ll-1]&&rmax(ll,rr)<=rr)
puts("Yes");
else
puts("No");
}
return 0;
}
牛客国庆训练,CCPC Camp DAY1 J 倍增,括号匹配的更多相关文章
- 牛客寒假基础集训营 | Day1 J题—u's的影响力(水题)
Day1 J题-u's的影响力 有一天,kotori发现了一个和lovelive相似的游戏:bangdream.令她惊讶的是,这个游戏和lovelive居然是同一个公司出的! kotori经过一段时间 ...
- 牛客国庆训练 H.千万别用树套树
链接https://ac.nowcoder.com/acm/contest/1108/H 国庆队内训练的题,当时还完全没思路,就没补.现在会树状数组了,倒是能想一想,不过网上题解好多用线段树传数组的? ...
- 牛客国庆集训派对Day6 A Birthday 费用流
牛客国庆集训派对Day6 A Birthday:https://www.nowcoder.com/acm/contest/206/A 题意: 恬恬的生日临近了.宇扬给她准备了一个蛋糕. 正如往常一样, ...
- 2019牛客国庆集训派对day5
2019牛客国庆集训派对day5 I.Strange Prime 题意 \(P=1e10+19\),求\(\sum x[i] mod P = 0\)的方案数,其中\(0 \leq x[i] < ...
- 牛客多校第3场 J 思维+树状数组+二分
牛客多校第3场 J 思维+树状数组+二分 传送门:https://ac.nowcoder.com/acm/contest/883/J 题意: 给你q个询问,和一个队列容量f 询问有两种操作: 0.访问 ...
- 牛客国庆集训派对Day1 L-New Game!(最短路)
链接:https://www.nowcoder.com/acm/contest/201/L 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- 牛客国庆集训派对Day1 L New Game!(堆优化dijkstra+建图)
链接:https://ac.nowcoder.com/acm/contest/201/L来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言2097 ...
- 牛客国庆集训派对Day4 J-寻找复读机
链接:https://www.nowcoder.com/acm/contest/204/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 1048576K,其他语言20 ...
- 牛客多校第五场 J:Plan
链接:https://www.nowcoder.com/acm/contest/143/J 来源:牛客网 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 262144K,其他语言524 ...
随机推荐
- Kafka权威指南 读书笔记之(三)Kafka 生产者一一向 Kafka 写入数据
不管是把 Kafka 作为消息队列.消息总线还是数据存储平台来使用 ,总是需要有一个可以往 Kafka 写入数据的生产者和一个从 Kafka 读取数据的消费者,或者一个兼具两种角色的应用程序. 开发者 ...
- Ubuntu 启动服务 失败 的 可能解决办法
➜ ~ service nfs-kernel-server start Job for nfs-server.service canceled. 如果遇到服务启动失败,请检查有关的文件夹是否创建( ...
- 细说log4j之概述
log4j官网:https://logging.apache.org/ log4j目前存在2个版本:log4j 1.x 和log4j 2.x,目前官方主推2.x版本(log4j 1.x已于2015.0 ...
- Java入门系列 Java 中的四种引用
Why java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型 ...
- Excel复制粘贴假死
把打印机都删除了试一下. 如果还有问题,就把迅雷监听关掉.
- 如何实现从 Redis 中订阅消息转发到 WebSocket 客户端
PHP 的redis扩展是阻塞式 IO ,使用订阅/发布模式时,会导致整个进程进入阻塞.因此必须使用Swoole\Redis异步客户端来实现. 实例代码 $server = new swoole_we ...
- git 出现 fatal: refusing to merge unrelated histories 错误
git pull 失败 ,提示:fatal: refusing to merge unrelated histories 其实这个问题是因为 两个 根本不相干的 git 库, 一个是本地库, 一个是远 ...
- 虚拟机中Linux安装(转)
地址:http://blog.csdn.net/u013142781/article/details/50529030 不是每一个程序员都必须玩过linux,只是博主觉得现在的很多服务器都是linux ...
- [C++]环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584)
Question 例题3-5 环状序列(CircularSequence,ACM/ICPC Seoul 2004,UVa1584) 长度为n的环状串有n种表示方法,分别为从某个位置开始顺时针得到,在这 ...
- javascript判断节点是否在dom
在项目中碰到同事写的一段代码: //焦点必须在实时dom树中 if (ele && typeof this.document.contains === "function&q ...