BZOJ2209: [Jsoi2011]括号序列
BZOJ2209: [Jsoi2011]括号序列
Description
Input
Output
Sample Input
)(())(
0 1 6
0 1 4
0 3 4
Sample Output
2
0
HINT
100%的数据满足N,Q不超过10^5。
题解Here!
#include<iostream>
#include<algorithm>
#include<cstdio>
#define MAXN 100010
using namespace std;
int n,m,size=0,root;
int val[MAXN];
char ch[MAXN];
struct Splay{int f,s,rev,inv,son[2];int v,sum,maxl,minl,maxr,minr;//v: 1 -> ( -1 -> )
}a[MAXN];
inline int read(){int date=0,w=1;char c=0;while(c<'0'||c>'9'){if(c=='-')w=-1;c=getchar();}while(c>='0'&&c<='9'){date=date*10+c-'0';c=getchar();}return date*w;
}
inline int min(const int x,const int y){return x<y?x:y;}
inline int max(const int x,const int y){return x>y?x:y;}
inline void pushup(int rt){if(!rt)return;a[rt].s=a[a[rt].son[0]].s+a[a[rt].son[1]].s+1;a[rt].sum=a[a[rt].son[0]].sum+a[a[rt].son[1]].sum+a[rt].v;a[rt].maxl=max(a[a[rt].son[0]].maxl,a[a[rt].son[0]].sum+a[rt].v+a[a[rt].son[1]].maxl);a[rt].minl=min(a[a[rt].son[0]].minl,a[a[rt].son[0]].sum+a[rt].v+a[a[rt].son[1]].minl);a[rt].maxr=max(a[a[rt].son[1]].maxr,a[a[rt].son[1]].sum+a[rt].v+a[a[rt].son[0]].maxr);a[rt].minr=min(a[a[rt].son[1]].minr,a[a[rt].son[1]].sum+a[rt].v+a[a[rt].son[0]].minr);
}
inline void pushdown_rev(int rt){if(!rt)return;a[rt].rev^=1;swap(a[rt].son[0],a[rt].son[1]);swap(a[rt].maxl,a[rt].maxr);swap(a[rt].minl,a[rt].minr);
}
inline void pushdown_inv(int rt){if(!rt)return;a[rt].inv^=1;a[rt].v=-a[rt].v;a[rt].sum=-a[rt].sum;a[rt].maxl=-a[rt].maxl;a[rt].minl=-a[rt].minl;a[rt].maxr=-a[rt].maxr;a[rt].minr=-a[rt].minr;swap(a[rt].maxl,a[rt].minl);swap(a[rt].maxr,a[rt].minr);
}
inline void pushdown(int rt){if(!rt)return;if(a[rt].rev){pushdown_rev(a[rt].son[0]);pushdown_rev(a[rt].son[1]);a[rt].rev=0;}if(a[rt].inv){pushdown_inv(a[rt].son[0]);pushdown_inv(a[rt].son[1]);a[rt].inv=0;}
}
inline void turn(int rt,int k){int x=a[rt].f,y=a[x].f;pushdown(x);pushdown(rt);a[x].son[k^1]=a[rt].son[k];if(a[rt].son[k])a[a[rt].son[k]].f=x;a[rt].f=y;if(y)a[y].son[a[y].son[1]==x]=rt;a[x].f=rt;a[rt].son[k]=x;pushup(x);pushup(rt);
}
void splay(int rt,int ancestry){while(a[rt].f!=ancestry){int x=a[rt].f,y=a[x].f;if(y==ancestry)turn(rt,a[x].son[0]==rt);else{int k=a[y].son[0]==x?1:0;if(a[x].son[k]==rt){turn(rt,k^1);turn(rt,k);}else{turn(x,k);turn(rt,k);}}}if(ancestry==0)root=rt;
}
inline int newnode(int x){int rt=++size;a[rt].son[0]=a[rt].son[1]=a[rt].f=0;a[rt].rev=a[rt].inv=0;a[rt].s=1;a[rt].v=a[rt].sum=val[x];return rt;
}
int buildtree(int l,int r){if(l>r)return 0;int lson=0,rson=0,mid=l+r>>1;lson=buildtree(l,mid-1);int rt=newnode(mid);rson=buildtree(mid+1,r);a[rt].son[0]=lson;a[rt].son[1]=rson;if(lson)a[lson].f=rt;if(rson)a[rson].f=rt;pushup(rt);return rt;
}
int kth(int rt,int k){while(1){pushdown(rt);int y=a[rt].son[0];if(k>a[y].s+1){k-=a[y].s+1;rt=a[rt].son[1];}else if(k<=a[y].s)rt=y;else return rt;}
}
inline void reverse(int l,int r){int front=kth(root,l),next=kth(root,r+2),q;splay(front,0);splay(next,front);q=a[next].son[0];pushdown_rev(q);pushup(next);pushup(front);
}
inline void invert(int l,int r){int front=kth(root,l),next=kth(root,r+2),q;splay(front,0);splay(next,front);q=a[next].son[0];pushdown_inv(q);pushup(next);pushup(front);
}
inline void query(int l,int r){int front=kth(root,l),next=kth(root,r+2),q;splay(front,0);splay(next,front);q=a[next].son[0];int ans=((a[q].maxr+1)>>1)-(a[q].minl-1)/2;printf("%d\n",ans);
}
void work(){char k[2];int f,x,y;while(m--){f=read();x=read();y=read();if(f==0)query(x,y);else if(f==1)invert(x,y);else reverse(x,y);}
}
void init(){n=read();m=read();scanf("%s",ch+2);for(int i=2;i<=n+1;i++)val[i]=(ch[i]==')'?-1:1);val[1]=val[n+2]=0;root=buildtree(1,n+2);
}
int main(){init();work();return 0;
}
转载于:https://www.cnblogs.com/Yangrui-Blog/p/9612530.html
BZOJ2209: [Jsoi2011]括号序列相关推荐
- BZOJ2209 [Jsoi2011]括号序列
一个括号序列将合法括号都去掉后将剩下左边一堆右括号和右边一堆左括号,这个括号序列变合法需要的步数就是(左括号数量+1)/2下取整加上(右括号数量+1)/2下取整 拿splay同时维护翻转标记和取反标记 ...
- BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html 题目传送门 - BZOJ2209 题解 我太弱了,调出这题感觉都要吐了. 题解懒得写了. ...
- BZOJ 2209 [Jsoi2011] 括号序列
Description Input 输入数据的第一行包含两个整数N和Q,分别表示括号序列的长度,以及操作的个数. 第二行包含一个长度为N的括号序列. 接下来Q行,每行三个整数t.x和y,分别表示操作的 ...
- bzoj1095: [ZJOI2007]Hide 捉迷藏 线段树维护括号序列 点分治 链分治
这题真是十分难写啊 不管是点分治还是括号序列都有一堆细节.. 点分治:时空复杂度$O(n\log^2n)$,常数巨大 主要就是3个堆的初始状态 C堆:每个节点一个,为子树中的点到它父亲的距离的堆. B ...
- 2016百度实习编程题:括号序列
不知如何解决 1.感觉贪心或者动态规划,不知道如何解决 2.做过生成合法括号序列的题目,想到用DFS补成合法的括号,然而没有成功
- UVA1626 括号序列 Brackets sequence(区间DP匹配括号,输出匹配方案)
整理的算法模板合集: ACM模板 UVA1626 Brackets sequence 我们将正规括号序列定义如下: 空序列是正规括号序列. 如果 SSS 是一个正规括号序列,那么 (S) 和 [S] ...
- [ Nowcoder Contest 165 #D ] 合法括号序列
\(\\\) \(Description\) 键盘上有三个键,敲击效果分别是: 在输出序列尾部添加一个左括号 在输出序列尾部添加一个右括号 删除输出序列尾部的第一个元素,若输出序列为空,则什么都不发生 ...
- BZOJ4350: 括号序列再战猪猪侠
Description 括号序列与猪猪侠又大战了起来. 众所周知,括号序列是一个只有(和)组成的序列,我们称一个括号 序列S合法,当且仅当: 1.( )是一个合法的括号序列. 2.若A是合法的括号序列 ...
- 常考数据结构与算法:括号序列
题目描述 给出一个仅包含字符'(',')','{','}','['和']',的字符串,判断给出的字符串是否是合法的括号序列 括号必须以正确的顺序关闭,"()"和"()[] ...
最新文章
- 建立Lotus Domino CA验证字权威
- 脚本大全_抖音文案大全2020励志:抖音最火励志搞笑句子,直接套用上热门
- JVM(2)之 JAVA堆
- 码农们不得不重视的问题
- 【开发环境】安装 Visual Studio Community 2013 开发环境 ( 下载 Visual Studio Community 2013 with Update 5 版本的安装包 )
- 3.10以上charles版本抓取Https数据包
- Nacos注册中心的部署与用法详细介绍
- 解读我所认知的网络营销根源
- jsonp和CORS跨域实现
- Chapter 5 Blood Type——33
- ServiceComb抛出llegalStateException: The schema(id=[xxx]) ...异常解决办法
- 【AI面试题】One-hot的作用,为什么不直接使用数字作为表示
- VMware:未能将管道连接到虚拟机, 所有的管道范例都在使用中
- 超越网络的JavaScript
- Ps钢笔工具及其附属工具的用法
- 机器学习如何优化策略游戏
- 计算机域是什么概念,什么是域?域的相关概念
- 小魔推如何解决实体商家痛点,实现短视频高转化
- ActiveMQ : Async error occurred: java.lang.OutO...
- Multimedia Event Extraction From News With a Unified Contrastive Learning Framework论文解读
热门文章
- array DEMO
- 万能数据库查询分析器使用技巧之(十四)
- thrift入门(1) -- 安装配置
- 通过结束进程来关闭程序
- make xconfig 报‘ptrdiff_t’ does not name a type错误解决方法
- 10.11 arping:发送arp请求
- 10.22 tcpdump:监听网络流量
- 【AWSL】之LVM与磁盘配额(PV、VG、LV、mkfs)
- java让线程空转_Java锁:悲观/乐观/阻塞/自旋/公平锁/闭锁,锁消除CAS及synchronized的三种锁级别...
- P1038 神经网络(拓扑排序)