您的位置:首页 > 其它

BZOJ2329: [HNOI2011]括号修复

2014-11-30 10:30 253 查看

2329: [HNOI2011]括号修复

Time Limit: 40 Sec Memory Limit: 128 MB
Submit: 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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: