mxqz
查看原帖
mxqz
377440
Y2y7m楼主2023/3/26 18:57

爆零,但是样例过了

#include <bits/stdc++.h>

using namespace std;
#define lson t[i].ch[0]
#define rson t[i].ch[1]
const int maxn=1e5+10;
int n,q;
char s[maxn];
int a[maxn];
struct fhq_treap
{
    int ch[2];
    int pri;
    int sz;
    int sum;
    int sufmx,premx,sufmin,premin;
    int lazycov,lazyrev,lazyinv;
}t[maxn];
int cnt,root;
int newnode(int x)
{
    t[++cnt].pri=rand();
    t[cnt].sz=1;
    t[cnt].sum=x;
	if(x==1) t[cnt].premx=t[cnt].sufmx=1;
	else t[cnt].premin=t[cnt].sufmin=-1;
    return cnt;
}
void update(int i)
{
    t[i].sz=t[lson].sz+t[rson].sz+1;
    t[i].sum=t[lson].sum+t[rson].sum+a[i];
	t[i].premx=max(t[lson].premx,t[lson].sum+a[i]+t[rson].premx);
	t[i].premin=min(t[lson].premin,t[lson].sum+a[i]+t[rson].premin);
	t[i].sufmx=max(t[rson].sufmx,t[rson].sum+a[i]+t[lson].sufmx);
	t[i].sufmin=min(t[rson].sufmin,t[rson].sum+a[i]+t[lson].sufmin);
}
void reverse(int i)
{
	if(!i) return ;
	swap(lson,rson);
	swap(t[i].premx,t[i].sufmx);
	swap(t[i].premin,t[i].sufmin);
	t[i].lazyrev^=1;
}
void invert(int i)
{
	if(!i) return ;
	a[i]=-a[i],t[i].sum=-t[i].sum;
	swap(t[i].premx,t[i].premin);
	t[i].premx=-t[i].premx,t[i].premin=-t[i].premin;
	swap(t[i].sufmx,t[i].sufmin);
	t[i].sufmx=-t[i].sufmx,t[i].sufmin=-t[i].sufmin;
	t[i].lazyinv^=1,t[i].lazycov=-t[i].lazycov;
}
void cover(int i,int d)
{
	if(!i) return ;
	a[i]=t[i].lazycov=d;
	t[i].sum=t[i].sz*d;
	if(d==1)
	{
		t[i].premin=t[i].sufmin=0;
		t[i].premx=t[i].sufmx=t[i].sum;
		return ;
	}
	t[i].premx=t[i].sufmx=0;
	t[i].premin=t[i].sufmin=t[i].sum;
}
void pushdown(int i)
{
	if(t[i].lazyinv)
	{
		invert(lson),invert(rson);
		t[i].lazyinv=0;
		return ;
	}
	if(t[i].lazycov)
	{
		cover(lson,t[i].lazycov),cover(rson,t[i].lazycov);
		t[i].lazycov=0;
		return ;
	}
	if(t[i].lazyrev)
	{
		reverse(lson),reverse(rson);
		t[i].lazyrev=0;
		return ;
	}
}
int merge(int x,int y)
{
	pushdown(x),pushdown(y);
    if(!x||!y) return x+y;
    if(t[x].pri<t[y].pri)
    {
        t[x].ch[1]=merge(t[x].ch[1],y);
        update(x);
        return x;
    }
    else
    {
        t[y].ch[0]=merge(x,t[y].ch[0]);
        update(y);
        return y;
    }
}
void split(int i,int k,int &x,int &y)
{
    if(i==0)
    {
        x=0,y=0;
        return ;
    }
    pushdown(i);
    if(t[lson].sz<k)
    {
        x=i;
        split(rson,k-t[lson].sz-1,rson,y);
    }
    else
    {
        y=i;
        split(lson,k,x,lson);
    }
    update(i);
}
void debug()
{
	for(int i=1;i<=n;i++) cout<<lson<<" "<<rson<<endl;
	cout<<endl;	
}
void opreverse(int l,int r)
{
	int x,y,z;
	split(root,l-1,x,y);
	split(y,r-l+1,y,z);
	reverse(y);
	root=merge(x,merge(y,z));
}
void opreplace(int l,int r,int d)
{
	int x,y,z;
	split(root,l-1,x,y);
	split(y,r-l+1,y,z);
	cover(y,d);
	root=merge(x,merge(y,z));	
}
void opinvert(int l,int r)
{
	int x,y,z;
	split(root,l-1,x,y);
	split(y,r-l+1,y,z);
	invert(y);
	root=merge(x,merge(y,z));
}
int query(int l,int r)
{
	int x,y,z,tmp,ans=0;
	split(root,l-1,x,y);
	split(y,r-l+1,y,z);
//	cout<<y<<" : "<<endl;
	update(y);
//	debug();
	tmp=t[y].premx;
//	cout<<tmp<<endl;
	if(tmp%2==1) tmp=tmp/2+1;
	else tmp=tmp/2;
	ans+=tmp;
	tmp=abs(t[y].sufmin);
//	cout<<tmp<<endl;
	if(tmp%2==1) tmp=tmp/2+1;
	else tmp=tmp/2;
	
	ans+=tmp;
	root=merge(x,merge(y,z));
	return ans;
}
int main()
{
	srand(time(0));
    ios::sync_with_stdio(false);
    cin>>n>>q>>s+1;
    for(int i=1;i<=n;i++)
    {
    	if(s[i]=='(') a[i]=-1;
    	else a[i]=1;    	
	}
    for(int i=1;i<=n;i++) root=merge(root,newnode(a[i]));
    char op[20];
    int x,y;
    char d;
    while(q--)
    {
    	cin>>op+1;
    	if(op[1]=='R')
    	{
    		cin>>x>>y>>d;
    		opreplace(x,y,d=='('?-1:1);
		}
		if(op[1]=='S')
		{
			cin>>x>>y;
			opreverse(x,y);
		}
		if(op[1]=='I')
		{
			cin>>x>>y;
			opinvert(x,y);
		}
		if(op[1]=='Q')
		{
			cin>>x>>y;
			cout<<query(x,y)<<endl;
		}
	}
    return 0;
}
/*
5 100
(((((
Replace 1 2 )
Replace 1 3 (
Query 1 4
Replace 1 1 )
Query 1 4

*/
2023/3/26 18:57
加载中...