求助动态开点wa 7
查看原帖
求助动态开点wa 7
1011279
Naoxiaoyu楼主2024/2/29 22:31
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=100000;
struct tree{
	int ls,rs;
	ll sum;
	int lazy,cor;
}t[N*100+10];
int root,tot;
int build()
{
	tot++;
	t[tot].sum=t[tot].ls=t[tot].rs=t[tot].cor=0;
	t[tot].lazy=-1;
	return tot;
}
void spread(int p,ll l,ll r)
{
	ll mid=(r+l)>>1;
	if(t[p].lazy!=-1)
	{
		if(!t[p].ls) t[p].ls=build();
		if(!t[p].rs) t[p].rs=build();
		t[t[p].ls].sum=(mid-l+1)*t[p].lazy;
		t[t[p].rs].sum=(r-mid)*t[p].lazy;
		t[t[p].ls].lazy=t[t[p].rs].lazy=t[p].lazy;
		t[t[p].ls].cor=t[t[p].rs].cor=0;
		t[p].lazy=-1;
	}
	if(t[p].cor)
	{
		t[p].cor=0;
		if(!t[p].ls) t[p].ls=build();
		if(!t[p].rs) t[p].rs=build();
		t[t[p].ls].sum=(mid-l+1)-t[t[p].ls].sum;
		t[t[p].rs].sum=(r-mid)-t[t[p].rs].sum;
		t[t[p].ls].cor^=1;
		t[t[p].rs].cor^=1;
		if(t[t[p].ls].lazy!=-1) t[t[p].ls].lazy^=1;
		if(t[t[p].ls].lazy!=-1) t[t[p].rs].lazy^=1;
	}
}
void insert(int p,ll l,ll r,ll x,ll y,int k)
{
	if(x<=l && y>=r)
	{
		t[p].sum=k*(r-l+1);
		t[p].lazy=k;
		t[p].cor=0;
		return;
	}
	spread(p,l,r);
	ll mid=(r+l)>>1;
	if(x<=mid)
	{
		if(!t[p].ls) t[p].ls=build();
		insert(t[p].ls,l,mid,x,y,k);
	}
	if(y>=mid+1)
	{
		if(!t[p].rs) t[p].rs=build();
		insert(t[p].rs,mid+1,r,x,y,k);
	}
	t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
}
void change(int p,ll l,ll r,ll x,ll y)
{
	if(x<=l && y>=r)
	{
		t[p].sum=(r-l+1)-t[p].sum;
		t[p].cor^=1;
		if(t[p].lazy!=-1) t[p].lazy^=1;
		return;
	}
	spread(p,l,r);
	ll mid=(r+l)>>1;
	if(x<=mid)
	{
		if(!t[p].ls) t[p].ls=build();
		change(t[p].ls,l,mid,x,y);
	}
	if(y>=mid+1)
	{
		if(!t[p].rs) t[p].rs=build();
		change(t[p].rs,mid+1,r,x,y);
	}
	t[p].sum=t[t[p].ls].sum+t[t[p].rs].sum;
}
ll ask(int p,ll l,ll r)
{
	if(l==r)
	{
		return l;
	}
	spread(p,l,r);
	ll mid=(r+l)>>1;
	if(t[p].sum==0) return l;
	if(t[p].sum==(r-l+1)) return r+1;
	if(t[t[p].ls].sum<(mid-l+1))
	{
		return ask(t[p].ls,l,mid);
	}
	else
	{
		return ask(t[p].rs,mid+1,r);
	}
}
int main()
{
	int q;
	scanf("%d",&q);
	root=build();
	for(int i=1;i<=q;i++)
	{
		int k;
		ll l,r;
		scanf("%d%lld%lld",&k,&l,&r);
		if(k==1) insert(1,1,1e18,l,r,1);
		else if(k==2) insert(1,1,1e18,l,r,0);
		else change(1,1,1e18,l,r);
		printf("%lld\n",ask(1,1,1e18));
	}
	return 0;
}
2024/2/29 22:31
加载中...