23分求调,悬关
查看原帖
23分求调,悬关
760345
封禁用户楼主2025/7/22 11:44
#include<bits/stdc++.h>
using namespace std;
#define lc u<<1
#define rc u<<1|1
struct node
{
	int l,r,p,sum,lazy;
}t[800010];
int a[200010];
void build(int u,int l,int r)
{
	t[u].l=l;
	t[u].r=r;
	if(l==r)
	{
		t[u].p=a[l];
		t[u].sum=a[r]-a[l-1];
		return;
	}
	int mid=(l+r)>>1;
	build(lc,l,mid);
	build(rc,mid+1,r);
	t[u].sum=t[lc].sum+t[rc].sum;
	t[u].p=min(t[lc].p,t[rc].p);
	return;
}
void push_down(int u)
{
	t[u].sum+=(t[u].r-t[u].l+1)*t[u].lazy;
	t[u].p+=t[u].lazy;
	t[lc].lazy+=t[u].lazy;
	t[rc].lazy+=t[u].lazy;
	t[u].lazy=0;
}
int find1(int u,int i)
{
//	cout<<"finding..."<<endl;
	push_down(u);
	if(t[u].l==t[u].r && t[u].l==i)
	{
		return t[u].p;
	}
	int mid=(t[u].l+t[u].r)>>1;
	if(i<=mid)
	{
		return find1(lc,i);
	}
	else
	{
		return find1(rc,i);
	}
}
void update(int u,int l,int r,int x)
{
	if(t[u].l>=l && t[u].r<=r)
	{
		t[u].sum+=(t[u].r-t[u].l+1)*x;
		t[u].lazy+=x;
		t[u].p+=x;
		return;
	}
	push_down(u);
	int mid=(t[u].l+t[u].r)>>1;
	if(l<=mid)
	{
		update(lc,l,mid,x);
	}
	if(r>mid)
	{
		update(rc,mid+1,r,x);
	}
	t[u].sum=t[lc].sum+t[rc].sum;
	t[u].p=min(t[lc].p,t[rc].p);
}
node find(int u,int l,int r)
{
	push_down(u);
	if(t[u].l>=l && t[u].r<=r)
	{
		return t[u];	
	}
	int mid=(t[u].l+t[u].r)>>1;
	node ls,rs;
	bool x=0,y=0;
	if(l<=mid)
	{
		x=1;
		ls=find(lc,l,mid);
	}
	if(r>mid)
	{
		y=1;
		rs=find(rc,mid+1,r);
	}
	if(x&&y)
	{
		node ans;
		ans.p=min(ls.p,rs.p);
		ans.sum=ls.sum+rs.sum;
		return ans;
	}
	if(x)
	{
		return ls;
	}
	return rs;
}
int main()
{
	int n,m;
	cin>>n>>m;
	string s;
	cin>>s;
	for(int i=0;i<n;i++)
	{
		a[i+1]=a[i];
		if(s[i]=='(')
		{
			a[i+1]++;
		}
		else
		{
			a[i+1]--;
		}
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int op,u,v;
		cin>>op>>u>>v;
		if(op==1)
		{
			swap(s[u-1],s[v-1]);
			if(s[u-1]!=s[v-1])
			{
				if(s[u-1]=='(')
				{
					update(1,u,v-1,2);
					update(1,v,n,-2);
				}
				else
				{
					update(1,u,v-1,-2);
					update(1,v,n,2);
				}
			}
		}
		else
		{
			node ans=find(1,u,v);
			if(u!=1)
			{
				if(ans.sum==0 && ans.p-find1(1,u-1)>=0 )
				{
					cout<<"Yes"<<endl;
				}
				else
				{
					cout<<"No"<<endl;
				}
			}
			else
			{
				if(ans.sum==0 && ans.p>=0 )
				{
					cout<<"Yes"<<endl;
				}
				else
				{
					cout<<"No"<<endl;
				}
			}
		}
	}
} 
2025/7/22 11:44
加载中...