求助动态开点TLE on test 11
查看原帖
求助动态开点TLE on test 11
233815
zhjzhmh楼主2023/4/2 17:09
#include<bits/stdc++.h>
#define int long long
#define n 1000000000000000000
using namespace std;
int q,l,r,opt,cnt,root;
struct node{int ls,rs,bo,s,tag;}tree[5000010];
void push(int x,int len)
{
	tree[tree[x].ls].s=(len+1)/2-tree[tree[x].ls].s;tree[tree[x].rs].s=len/2-tree[tree[x].rs].s;
	tree[tree[x].ls].tag^=1,tree[tree[x].rs].tag^=1;
	tree[x].tag=0;
}
void down(int x,int len)
{
	tree[tree[x].ls].tag=tree[tree[x].rs].tag=0;
	tree[tree[x].ls].s=tree[x].bo*(len+1)/2;tree[tree[x].rs].s=tree[x].bo*len/2;
	tree[tree[x].ls].bo=tree[tree[x].rs].bo=tree[x].bo;
	tree[x].bo=-1;
}
void change(int &x,int l,int r,int L,int R,int c)
{
	if(!x) x=++cnt,tree[x].bo=-1;
	if(l<=L&&R<=r) {tree[x].bo=c;tree[x].tag=0;tree[x].s=c*(R-L+1);return;}
	int mid=(L+R)/2;
	if(tree[x].bo!=-1)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		down(x,R-L+1);
	}
	if(tree[x].tag)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		push(x,R-L+1);
	}
	if(l<=mid) change(tree[x].ls,l,r,L,mid,c);
	if(mid<r) change(tree[x].rs,l,r,mid+1,R,c);
	tree[x].s=tree[tree[x].ls].s+tree[tree[x].rs].s;
}
void upd(int &x,int l,int r,int L,int R)
{
	if(!x) x=++cnt,tree[x].bo=-1;
	if(l<=L&&R<=r) {tree[x].tag^=1;tree[x].s=R-L+1-tree[x].s;return;}
	int mid=(L+R)/2;
	if(tree[x].bo!=-1)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		down(x,R-L+1);
	}
	if(tree[x].tag)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		push(x,R-L+1);
	}
	if(l<=mid) upd(tree[x].ls,l,r,L,mid);
	if(mid<r) upd(tree[x].rs,l,r,mid+1,R);
	tree[x].s=tree[tree[x].ls].s+tree[tree[x].rs].s;
}
int query(int &x,int L,int R)
{
	if(!x) x=++cnt,tree[x].bo=-1;
	if(tree[x].s==0) return L;
	if(tree[x].s==R-L+1) return n+1;
	int mid=(L+R)/2;
	if(tree[x].bo!=-1)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		down(x,R-L+1);
	}
	if(tree[x].tag)
	{
		if(!tree[x].ls) tree[x].ls=++cnt,tree[tree[x].ls].bo=-1;
		if(!tree[x].rs) tree[x].rs=++cnt,tree[tree[x].rs].bo=-1;
		push(x,R-L+1);
	}
	return min(n+1,min(query(tree[x].ls,L,mid),query(tree[x].rs,mid+1,R)));
}
signed main()
{
	cin>>q;
	while(q--)
	{
		scanf("%lld%lld%lld",&opt,&l,&r);
		if(opt==1||opt==2) change(root,l,r,1,n,2-opt);
		  else upd(root,l,r,1,n);
		printf("%lld\n",query(root,1,n));
	}
} 

RT

2023/4/2 17:09
加载中...