BZOJ2209 [Jsoi2011]括号序列 splay
原文链接http://www.cnblogs.com/zhouzhendong/p/8093556.html
题目传送门 - BZOJ2209
题解
我太弱了,调出这题感觉都要吐了。
题解懒得写了。
给一个链接:
http://blog.csdn.net/lych_cys/article/details/50700277
代码
#include <cstring>
#include <cstdio>
#include <algorithm>
#include <cstdlib>
#include <cmath>
using namespace std;
const int N=100005;
int fa[N],son[N][2],rev1[N],rev2[N],root;
int Lmin[N],Lmax[N],Rmin[N],Rmax[N],sum[N],val[N],size[N];
void pushup(int x){
int ls=son[x][0],rs=son[x][1];
sum[x]=sum[ls]+val[x]+sum[rs];
size[x]=size[ls]+size[rs]+1;
Lmin[x]=min(Lmin[ls],sum[ls]+val[x]+Lmin[rs]);
Lmax[x]=max(Lmax[ls],sum[ls]+val[x]+Lmax[rs]);
Rmin[x]=min(Rmin[rs],sum[rs]+val[x]+Rmin[ls]);
Rmax[x]=max(Rmax[rs],sum[rs]+val[x]+Rmax[ls]);
}
int build(int pre,int L,int R){
if (L>R)
return 0;
int mid=(L+R)>>1;
fa[mid]=pre;
if (L==R){
Lmin[mid]=Rmin[mid]=Lmax[mid]=Rmax[mid]=0;
sum[mid]=val[mid],size[mid]=1;
if (val[mid]<0)
Lmin[mid]=Rmin[mid]=-1;
if (val[mid]>0)
Lmax[mid]=Rmax[mid]=1;
return mid;
}
son[mid][0]=build(mid,L,mid-1);
son[mid][1]=build(mid,mid+1,R);
pushup(mid);
return mid;
}
void pushson(int x,int r1,int r2){
if (!x)
return;
if (r1){
rev1[x]^=1;
swap(Lmin[x],Lmax[x]),Lmin[x]=-Lmin[x],Lmax[x]=-Lmax[x];
swap(Rmin[x],Rmax[x]),Rmin[x]=-Rmin[x],Rmax[x]=-Rmax[x];
sum[x]=-sum[x];
val[x]=-val[x];
}
if (r2){
rev2[x]^=1;
swap(Lmin[x],Rmin[x]);
swap(Lmax[x],Rmax[x]);
swap(son[x][0],son[x][1]);
}
}
void pushdown(int x){
int &ls=son[x][0],&rs=son[x][1],&r1=rev1[x],&r2=rev2[x];
pushson(ls,r1,r2);
pushson(rs,r1,r2);
r1=r2=0;
}
void pushadd(int x){
if (fa[x])
pushadd(fa[x]);
pushdown(x);
}
int wson(int x){
return son[fa[x]][1]==x;
}
void rotate(int x){
if (!fa[x])
return;
int y=fa[x],z=fa[y],L=wson(x),R=L^1;
if (z)
son[z][wson(y)]=x;
fa[x]=z,fa[y]=x,fa[son[x][R]]=y;
son[y][L]=son[x][R],son[x][R]=y;
pushup(y),pushup(x);
}
void splay(int x,int rt){
if (!x)
return;
if (!rt)
root=x;
pushadd(x);
for (int y=fa[x];fa[x]!=rt;rotate(x),y=fa[x])
if (fa[y]!=rt)
rotate(wson(x)==wson(y)?y:x);
}
int findkth(int x,int k){
pushdown(x);
if (size[son[x][0]]+1==k)
return x;
if (k<=size[son[x][0]])
return findkth(son[x][0],k);
else
return findkth(son[x][1],k-size[son[x][0]]-1);
}
int n,m;
char str[N];
int main(){
scanf("%d%d%s",&n,&m,str+2);
memset(val,0,sizeof val);
for (int i=2;i<=n+1;i++)
val[i]=str[i]=='('?1:-1;
root=build(0,1,n+2);
for (int i=1;i<=m;i++){
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
x=findkth(root,x),y=findkth(root,y+2);
splay(x,0);
splay(y,x);
int z=son[y][0];
if (op==0)
printf("%d\n",(Rmax[z]+1)/2-(Lmin[z]-1)/2);
if (op==1)
pushson(z,1,0);
if (op==2)
pushson(z,0,1);
}
return 0;
}
BZOJ2209 [Jsoi2011]括号序列 splay的更多相关文章
- bzoj 2209: [Jsoi2011]括号序列 splay
		
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 833 Solved: 392[Submit][Status ...
 - BZOJ 2209: [Jsoi2011]括号序列 [splay 括号]
		
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1111 Solved: 541[Submit][Statu ...
 - 【BZOJ2329/2209】[HNOI2011]括号修复/[Jsoi2011]括号序列 Splay
		
[BZOJ2329/2209][HNOI2011]括号修复/[Jsoi2011]括号序列 题解:我们的Splay每个节点维护如下东西:左边有多少多余的右括号,右边有多少多余的左括号,同时为了反转操作, ...
 - BZOJ2209: [Jsoi2011]括号序列
		
传送门 splay练习. 考虑把括号序列转化成类似于区间最大/最小值的情况. 显然我们可以知道括号序列消完的情况肯定是$a$个)和$b$个(,那么把这些括号全部合法化的代价显然就是$\frac{a+1 ...
 - bzoj 2209 [Jsoi2011]括号序列 平衡树
		
2209: [Jsoi2011]括号序列 Time Limit: 20 Sec Memory Limit: 259 MBSubmit: 1404 Solved: 699[Submit][Statu ...
 - 【BZOJ】2209: [Jsoi2011]括号序列(splay)
		
http://www.lydsy.com/JudgeOnline/problem.php?id=2209 splay又犯逗........upd1那里的sum忘记赋值反............. 本题 ...
 - 【BZOJ-2329&2209】括号修复&括号序列      Splay
		
2329: [HNOI2011]括号修复 Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 1007 Solved: 476[Submit][Statu ...
 - [BZOJ3786] 星系探索(括号序列+Splay)
		
3786: 星系探索 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 2191 Solved: 644[Submit][Status][Discuss ...
 - [HNOI2011]括号修复 / [JSOI2011]括号序列
		
传送门 Solution 一道题花费了两天的时间-- 在大佬@PinkRabbit的帮助下,终于AC了,感动-- 首先,我们考虑一个括号序列被修改成合法序列需要的次数: 我们需要修改的其实是形如... ...
 
随机推荐
- Android性能优化之图片压缩优化
			
1 分类Android图片压缩结合多种压缩方式,常用的有尺寸压缩.质量压缩.采样率压缩以及通过JNI调用libjpeg库来进行压缩. 参考此方法:Android-BitherCompress 备注:对 ...
 - SQL Server管理员必备技能之性能优化
			
SQL Server管理员必备技能之性能优化 高文龙关注1人评论1171人阅读2017-09-22 08:27:41 SQL Server 作为企业必不可少的服务之一,所以对于管理员的日常运维是一个极 ...
 - ionic3 出现莫名广告
			
应用上线出现 有莫名其妙的广告弹出. 1,DNS被劫持 2,第三方包带广告 3,Http被劫持 wifi和4G网都出现了广告,所以可以直接排除DNS被劫持的问题 广告页只会在H5的页面出现,所以基本可 ...
 - NMT 机器翻译
			
本文近期学习NMT相关知识,学习大佬资料,汇总便于后期复习用,有问题,欢迎斧正. 目录 RNN Seq2Seq Attention Seq2Seq + Attention Transformer Tr ...
 - Python的图像库
			
对数字图像基本的处理的学习按照下面两个博客: Python的图像库(Opencv.PIL.matplotlib.skimage)的使用(读取.存储.变换.滤波) python数字图像处理
 - cf round546 cde
			
第一题会卡一下同时用set和cin.. 其他的注意下矩阵对角线下标的应用即可 #include<bits/stdc++.h> using namespace std; #define ma ...
 - bzoj 3191
			
非常好的一道题 看到这道题,肯定能想到概率dp,但是状态的设计与转移都是一个难点 如果正向模拟来设计状态,那么不难发现是很难以转移的 所以我们考虑反向模拟,用类似博弈的方法来转移 不难发现,如果只剩了 ...
 - 20165314 2016-2017-2 《Java程序设计》第9周学习总结
			
20165314 2016-2017-2 <Java程序设计>第9周学习总结 教材学习内容总结 URl类 UDP数据报 广播数据报 套接字 套接字连接机制 代码托管
 - 20165314 Linux安装及学习
			
Linux的安装 安装虚拟机比我想象中要来的简单,虽然在这过程中出现了一些粗心大意导致的问题,但是重新再做一遍,问题就都解决了,比如: 未能加载虚拟光盘 在云班课的得到了同学的提示下我把虚拟机桌面的光 ...
 - 微信小程序 如何获取用户code
			
1.首先需要获取code 使用 wx.login({ success: function(res) { console.log(res);//这里的返回值里面便包含code }, fail: func ...