MnZn刚学FHQ,过样例但是全WA求调
查看原帖
MnZn刚学FHQ,过样例但是全WA求调
581316
small_john楼主2024/1/12 21:22

rt,代码如下:

#include <bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
int n,m;
struct node{
	int val,pmx,smx,pmn,smn,sum,sz,key,ls,rs;
	int tag1,tag2,tag3;
}t[N];
int cnt;
inline int make(int v)
{
	t[++cnt].sz = 1;
	t[cnt].key = rand();
	if(v==1) t[cnt].pmx = t[cnt].smx = 1;
	else t[cnt].pmn = t[cnt].smn = -1;
	t[cnt].sum = t[cnt].val = v;
	return cnt;
}
inline void fan(int k)
{
	if(!k) return;
	t[k].val = -t[k].val,t[k].sum = -t[k].sum;
	swap(t[k].pmx,t[k].pmn),swap(t[k].smx,t[k].smn);
	t[k].pmx = -t[k].pmx,t[k].pmn = -t[k].pmn,t[k].smx = -t[k].smx,t[k].smn = -t[k].smn;
	t[k].tag1^=1,t[k].tag2*=-1;
}
inline void cover(int k,int v)
{
	if(!k) return;
	t[k].sum = t[k].sz*v,t[k].val = v;
	if(v==1) t[k].pmx = t[k].smx = t[k].sum,t[k].smn = t[k].pmn = 0;
	else t[k].pmn = t[k].smn = t[k].sum,t[k].smx = t[k].pmx = 0;
	t[k].tag2 = v;
}
inline void reverse(int k)
{
	if(!k) return;
	swap(t[k].smx,t[k].pmx),swap(t[k].smn,t[k].pmn),swap(t[k].ls,t[k].rs);
	t[k].tag3^=1;
}
inline void down(int k)
{
	if(!k) return;
	if(t[k].tag1) fan(t[k].ls),fan(t[k].rs),t[k].tag1 = 0;
	if(t[k].tag2) cover(t[k].ls,t[k].tag2),cover(t[k].rs,t[k].tag2),t[k].tag2 = 0;
	if(t[k].tag3) reverse(t[k].ls),reverse(t[k].rs),t[k].tag3 = 0;
}
inline void pushup(int k)
{
	t[k].sum = t[t[k].ls].sum+t[t[k].rs].sum+t[k].val;
	t[k].sz = t[t[k].ls].sz+t[t[k].rs].sz+1;
	t[k].pmn = min(t[t[k].ls].pmn,t[t[k].ls].sum+t[k].val+t[t[k].rs].pmn);
	t[k].pmx = max(t[t[k].ls].pmx,t[t[k].ls].sum+t[k].val+t[t[k].rs].pmx);
	t[k].smn = min(t[t[k].rs].smn,t[t[k].rs].sum+t[k].val+t[t[k].ls].smn);
	t[k].smx = max(t[t[k].rs].smx,t[t[k].rs].sum+t[k].val+t[t[k].ls].smx);
}
int merge(int x,int y)
{
	down(x),down(y);
	if(x==0||y==0) return x+y;
	if(t[x].key<t[y].key)
	{
		t[x].rs = merge(t[x].rs,y),pushup(t[x].rs);
		return x;
	}
	else
	{
		t[y].ls = merge(x,t[y].ls),pushup(t[y].ls);
		return y;
	}
}
void split(int k,int v,int &x,int &y)
{
	if(!k) return x = y = 0,void();
	down(k); 
	if(t[t[k].ls].sz<v) x = k,split(t[k].rs,v-t[t[k].ls].sz-1,t[k].rs,y);
	else y = k,split(t[k].ls,v,x,t[k].ls);
	pushup(k);
}
string s;
int rt,x,y,z;
void dfs(int k)
{
	if(!k) return;
	down(k);
	dfs(t[k].ls),cout<<t[k].val<<' ',dfs(t[k].rs);
}
signed main()
{
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	srand(114514);
	cin>>n>>m>>s;
	for(auto i:s)
		rt = merge(rt,make(i==')'?1:-1));
	while(m--)
	{
		string op;char ch;
		int l,r;
		cin>>op>>l>>r;
		split(rt,l-1,x,y);
		split(y,r-l+1,y,z);
		if(op[0]=='R') cin>>ch,cover(y,(ch==')'?1:-1));
		else if(op[0]=='S') reverse(y);
		else if(op[0]=='I') fan(y);
		else cout<<(-t[y].pmn+1)/2+(t[y].smx+1)/2<<'\n';
		rt = merge(x,merge(y,z));
//		dfs(rt);
//		cout<<'\n';
	}
	return 0;
}
2024/1/12 21:22
加载中...