V-Parenthesis 前缀+ZKW线段树或RMQ
题意就是给出一个正确配对的括号序列,问交换两个括号以后是否依旧正确配对,一般括号配对都可以使用遇到左括号加一,遇到右括号减一的方法,中间过程中不能出现负值,否则配对失败,这道题也可以这样做,先求出前缀和,如:
编号: 1 2 3 4 5 6 7 8
( ( ( ) ) ) ( )
前缀: 1 2 3 2 1 0 1 0
有两种仍然可以配对的交换:1.当交换的两个括号相同时,2.ai是右括号,bi是左括号时,根据示例可以看出;
唯一一种可能发生不配对的交换:ai是左括号,bi是右括号;当有右括号加入ai位置时,从ai位置到bi-1位置的前缀和全部都要减2,所以ai到bi-1区间内最小值至少为2,这样就变成了查询区间最小值问题了,可以用线段树,也可以RMQ(代码待补);因为刚刚学习线段树,又刚好听说ZKW线段树代码比较精简,所以临时现去学习了一下,结果发现好多给的示例代码都是错的。。。这个版本可能也有错,但是AC了就好。。。哈哈哈哈哈哈哈哈哈嗝。。。。
zkw线段树:
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; const int N = + ;
const int INF = (<<);
int sum[N],T[N<<],cnt,M;
char ch[N]; void Build(int n){
int i;
for(M=;M<=n+;M*=);
for(i=+M;i<=n+M;i++) T[i] = sum[cnt++];
for(i=M-;i;i--) T[i]=min(T[i<<],T[i<<|]);
} void Update(int n,int V){
for(T[n+=M]=V,n/=;n;n/=)
T[n]=min(T[n<<],T[n<<|]);
} int Query(int s,int t){
int minc=INF;
for(s=s+M-,t=t+M+;s^t^;s/=,t/=){
if(~s&) minc=min(minc,T[s^]);
if(t&) minc=min(minc,T[t^]);
}
return minc;
}
int main(){
int n,q,a,b;
while(scanf("%d %d",&n,&q)==){
scanf("%s",ch+);
sum[] = ;
for(int i=;i<=n;i++){
if(ch[i]=='(') sum[i]=sum[i-]+;
else sum[i]=sum[i-]-;
}
cnt = ;
Build(n);
for(int i=;i<q;i++){
scanf("%d %d",&a,&b);
if(a > b) swap(a,b);
if(ch[a]==ch[b] || (ch[a]==')'&&ch[b]=='(')){ printf("Yes\n"); continue; }
int ret = Query(a,b-);
printf("%s\n",ret>=?"Yes":"No");
}
}
return ;
}
RMQ:
#include<iostream>
#include<cstring>
#include<cstdio> using namespace std; const int N = + ;
const int INF = (<<);
int sum[N],dp[N][],cnt,n;
char ch[N];
void RMQ_Init(){
memset(dp,,sizeof(dp));
for(int i=;i<n+;i++) dp[i][] = sum[i];
for(int j=;(<<j)<=n+;j++)
for(int i=;i+(<<j)- < n+;i++)
dp[i][j] = min(dp[i][j-],dp[i+(<<(j-))][j-]);
}
int RMQ(int L,int R){
int k = ;
while((<<(k+))<=R-L+) k++;
return min(dp[L][k],dp[R-(<<k)+][k]);
}
int main(){
int q,a,b;
while(scanf("%d %d",&n,&q)==){
scanf("%s",ch+);
sum[] = ;
for(int i=;i<=n;i++){
if(ch[i]=='(') sum[i]=sum[i-]+;
else sum[i]=sum[i-]-;
}
cnt = ;
RMQ_Init();
for(int i=;i<q;i++){
scanf("%d %d",&a,&b);
if(a > b) swap(a,b);
if(ch[a]==ch[b] || (ch[a]==')'&&ch[b]=='(')){ printf("Yes\n"); continue; }
int ret = RMQ(a,b-);
printf("%s\n",ret>=?"Yes":"No");
}
}
return ;
}
V-Parenthesis 前缀+ZKW线段树或RMQ的更多相关文章
- Parenthesis(前缀和+线段树)
1809: Parenthesis Time Limit: 5 Sec Memory Limit: 128 Mb Submitted: 2291 Solved: 622 Des ...
- zkw线段树详解
转载自:http://blog.csdn.net/qq_18455665/article/details/50989113 前言 首先说说出处: 清华大学 张昆玮(zkw) - ppt <统计的 ...
- HDU 4366 Successor(树链剖分+zkw线段树+扫描线)
[题目链接] http://acm.hdu.edu.cn/showproblem.php?pid=4366 [题目大意] 有一个公司,每个员工都有一个上司,所有的人呈树状关系,现在给出每个人的忠诚值和 ...
- [SinGuLaRiTy] ZKW线段树
[SinGuLaRiTy-1007] Copyrights (c) SinGuLaRiTy 2017. All Rights Reserved. 关于ZKW线段树 Zkw线段树是清华大学张昆玮发明非递 ...
- 线段树(单标记+离散化+扫描线+双标记)+zkw线段树+权值线段树+主席树及一些例题
“队列进出图上的方向 线段树区间修改求出总量 可持久留下的迹象 我们 俯身欣赏” ----<膜你抄> 线段树很早就会写了,但一直没有总结,所以偶尔重写又会懵逼,所以还是要总结一下. ...
- ZKW线段树入门
Part 1 来说说它的构造 线段树的堆式储存 我们来转成二进制看看 小学生问题:找规律 规律是很显然的 一个节点的父节点是这个数左移1,这个位运算就是低位舍弃,所有数字左移一位 一个节点的子节点是这 ...
- BZOJ3173 TJOI2013最长上升子序列(Treap+ZKW线段树)
传送门 Description 给定一个序列,初始为空.现在我们将1到N的数字插入到序列中,每次将一个数字插入到一个特定的位置.每插入一个数字,我们都想知道此时最长上升子序列长度是多少? Input ...
- 数据结构3——浅谈zkw线段树
线段树是所有数据结构中,最常用的之一.线段树的功能多样,既可以代替树状数组完成"区间和"查询,也可以完成一些所谓"动态RMQ"(可修改的区间最值问题)的操作.其 ...
- 有趣的 zkw 线段树(超全详解)
zkw segment-tree 真是太棒了(真的重口味)!写篇博客纪念入门 emmm...首先我们来介绍一下 zkw 线段树这个东西(俗称 "重口味" ,与 KMP 类似,咳咳. ...
随机推荐
- DevExpress v18.2版本亮点——Analytics Dashboard篇(一)
行业领先的.NET界面控件——DevExpress v18.2版本亮点详解,本文将介绍了DevExpress Analytics Dashboard v18.2 的版本亮点,新版30天免费试用!点击下 ...
- RouterOS基础安装配置
安装 光盘安装 载入光盘,按"A"全选按"I"进行安装,然后提示不否用旧的配置,按"N"全新安装,警告时按"Y"确定 安 ...
- JavaSE---显式锁
1.概述 1.1.jdk5之前,用于 调节共享对象访问机制 只有 synchronized.volatile: jdk5之后,提供了 显示锁:Lock.ReentrantLock...: ...
- MySQL数据库2表的增删改查
目录 一.数据表(文件): 1.1增 1.2查看表内数据 1.3改 1.4删除列表 1.5查看库内列表及表结构 1.6复制表结构 二.列类型:(*********) 2.1数字 2.2字符串 2.3时 ...
- 一天久坐办公室,怎么减fei?!
久坐的危害想必看到这篇文章的,一定都百度浏览了好多文章了,所以危害大家也都知道了,这里也就不一一列出. 久坐有危害,那么怎么减少危害呢,办法是什么???那就是不久坐啦.可是因为工作性质,不久坐臣妾恐怕 ...
- Leetcode 16. 3Sum Closest(指针搜索)
16. 3Sum Closest Medium 131696FavoriteShare Given an array nums of n integers and an integer target, ...
- 解决 UIAlterController 不居中问题
最后更新:2017-06-30 现象描述 新公司做的解决的第一个bug 就是 UIAlterController 不居中,莫名其妙的飞出屏幕之外 找了很久的答案,最终在苹果论坛看到了相关的描述 We ...
- 大数据笔记(三)——Hadoop2.0的安装与配置
一.Hadoop安装部署的预备条件 准备:1.安装Linux和JDK. 安装JDK 解压:tar -zxvf jdk-8u144-linux-x64.tar.gz -C ~/training/ 设置环 ...
- Mybatis一对一关联查询
有两张表,老师表teacher和班级表class,一个class班级对应一个teacher,一个teacher对应一个class 需求是根据班级id查询班级信息(带老师的信息) 创建teacher和c ...
- PHP执行外部程序
备份/恢复数据库 exec - 执行一个外部程序(在php文件所在目录进行执行) 很久以前写的,很多方法是项目中的直接复制粘体用不了,只能提供下思路. 用到执行外部程序的就这一句: exec(&quo ...