BZOJ2329: [HNOI2011]括号修复
2014-11-30 10:30
253 查看
2329: [HNOI2011]括号修复
Time Limit: 40 Sec Memory Limit: 128 MBSubmit: 485 Solved: 240
[Submit][Status]
Description
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #include<iostream> #include<vector> #include<map> #include<set> #include<queue> #include<string> #define inf 1000000000 #define maxn 150000+5 #define maxm 500+100 #define eps 1e-10 #define ll long long #define pa pair<int,int> #define for0(i,n) for(int i=0;i<=(n);i++) #define for1(i,n) for(int i=1;i<=(n);i++) #define for2(i,x,y) for(int i=(x);i<=(y);i++) #define for3(i,x,y) for(int i=(x);i>=(y);i--) #define mod 1000000007 using namespace std; inline int read() { int x=0,f=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=10*x+ch-'0';ch=getchar();} return x*f; } int n,m,c[maxn][2],fa[maxn],li[maxn],ri[maxn],lx[maxn],rx[maxn],sum[maxn],s[maxn],v[maxn]; int rt,t1,t2; bool cov[maxn],rev[maxn],inv[maxn]; inline void pushup(int x) { int l=c[x][0],r=c[x][1]; s[x]=s[l]+s[r]+1; sum[x]=sum[l]+sum[r]+v[x]; lx[x]=max(lx[l],sum[l]+v[x]+max(0,max(lx[r],sum[r]))); rx[x]=max(rx[r],sum[r]+v[x]+max(0,max(rx[l],sum[l]))); li[x]=min(li[l],sum[l]+v[x]+min(0,min(li[r],sum[r]))); ri[x]=min(ri[r],sum[r]+v[x]+min(0,min(ri[l],sum[l]))); } inline void rotate(int x,int &k) { int y=fa[x],z=fa[y],l=c[y][1]==x,r=l^1; if(y!=k)c[z][c[z][1]==y]=x;else k=x; fa[x]=z;fa[y]=x;fa[c[x][r]]=y; c[y][l]=c[x][r];c[x][r]=y; pushup(y);pushup(x); } inline void splay(int x,int &k) { while(x!=k) { int y=fa[x],z=fa[y]; if(y!=k) { if(c[z][0]==y^c[y][0]==x)rotate(x,k);else rotate(y,k); } rotate(x,k); } } inline void cover(int x,int y) { cov[x]=1;v[x]=y;rev[x]=inv[x]=0; sum[x]=s[x]*y; lx[x]=rx[x]=y>0?sum[x]:0; li[x]=ri[x]=y>0?0:sum[x]; } inline void rever(int x) { if(cov[x])return; rev[x]^=1; swap(c[x][0],c[x][1]); swap(lx[x],rx[x]); swap(li[x],ri[x]); } inline void invert(int x) { inv[x]^=1;v[x]=-v[x]; swap(li[x],lx[x]);li[x]=-li[x];lx[x]=-lx[x]; swap(ri[x],rx[x]);ri[x]=-ri[x];rx[x]=-rx[x]; sum[x]=-sum[x]; if(cov[x])inv[x]=0; } inline void pushdown(int x) { if(cov[x]){cover(c[x][0],v[x]);cover(c[x][1],v[x]);cov[x]=0;} if(rev[x]){rever(c[x][0]);rever(c[x][1]);rev[x]=0;} if(inv[x]){invert(c[x][0]);invert(c[x][1]);inv[x]=0;} } inline int find(int x,int k) { pushdown(x); int l=c[x][0],r=c[x][1]; if(s[l]+1==k)return x; else if(s[l]>=k)return find(l,k); else return find(r,k-s[l]-1); } inline void split(int l,int r) { t1=find(rt,l);t2=find(rt,r); splay(t1,rt);splay(t2,c[t1][1]); } inline void build(int l,int r,int f) { if(l>r)return; int x=(l+r)>>1; fa[x]=f;c[f][x>f]=x; if(l==r){s[x]=1;li[x]=ri[x]=v[x]>0?0:v[x];lx[x]=rx[x]=v[x]>0?v[x]:0;sum[x]=v[x];return;} build(l,x-1,x);build(x+1,r,x); pushup(x); } int main() { freopen("input.txt","r",stdin); freopen("output.txt","w",stdout); n=read();m=read(); v[1]=v[n+2]=0; for2(i,2,n+1){char ch=getchar();while(ch!='('&&ch!=')')ch=getchar();v[i]=ch=='('?1:-1;} build(1,n+2,0);rt=(1+n+2)>>1; while(m--) { int ch=read();int x=read(),y=read();split(x,y+2);int z=c[t2][0]; if(!ch)printf("%d\n",(-li[z]+1)/2+(rx[z]+1)/2); else if(ch==1)invert(z);else rever(z); pushup(t2);pushup(t1); } return 0; }
View Code
相关文章推荐
- 【BZOJ】2329: [HNOI2011]括号修复(splay+特殊的技巧)
- bzoj2329 [HNOI2011]括号修复
- [BZOJ2329][HNOI2011]括号修复
- BZOJ 2329 HNOI2011 括号修复 Splay
- bzoj2329 [HNOI2011]括号修复(splay)
- 【bzoj2329】[HNOI2011]括号修复 Splay
- BZOJ2329: [HNOI2011]括号修复
- BZOJ 2329 HNOI 2011 括号修复 Splay维护最大连续子段和
- 【bzoj2329】[HNOI2011]括号修复
- bzoj千题计划222:bzoj2329: [HNOI2011]括号修复(fhq treap)
- BZOJ 2329 HNOI 2011 括号修复 —— 标记处理的原则
- 【BZOJ-2329】[HNOI2011] 括号修复
- BZOJ2329 HNOI2011 括号修复 splay+贪心
- bzoj 2329: [HNOI2011]括号修复 splay
- bzoj 2329 [HNOI2011]括号修复 splay
- 【bzoj2329】[HNOI2011]括号修复 splay
- BZOJ 2329: [HNOI2011]括号修复 [splay 括号]
- [HNOI2011][bzoj 2329] 括号修复 [splay+前缀和]
- Bzoj2329: [HNOI2011]括号修复
- ●BZOJ 2329 [HNOI2011]括号修复.cpp