[悬关] 求助动态开点线段树 WA on #7
查看原帖
[悬关] 求助动态开点线段树 WA on #7
514283
_Cheems楼主2023/8/18 21:50

rt,蒟蒻调不出来,代码如下:

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int K=1e7,L=1,R=1e18+10;
int n,l,r,f,ans;
namespace Sm_tree{
	//1:0 2:1 3:xor
	#define mid ((l+r)>>1)
	int cnt=1,t[K],rs[K],ls[K];
	short tag[K];
	inline void up(int u){
		if(!rs[u]) rs[u]=++cnt;
		if(!ls[u]) ls[u]=++cnt;
		t[u]=t[ls[u]]+t[rs[u]];
	}
	inline void down(int u,int l,int r){
		if(!rs[u]) rs[u]=++cnt;
		if(!ls[u]) ls[u]=++cnt;
		if(!tag[u]) return ;
		if(tag[u]^3){
			t[ls[u]]=(mid-l+1)*(tag[u]-1);
			t[rs[u]]=(r-mid)*(tag[u]-1);
			tag[ls[u]]=tag[u];
			tag[rs[u]]=tag[u];
		}
		else{
			if(!tag[ls[u]]){
				t[ls[u]]=mid-l+1-t[ls[u]];
				tag[ls[u]]=3;
			}
			else{
				if(tag[ls[u]]==1){
					t[ls[u]]=mid-l+1;
					tag[ls[u]]=2;
				}
				else{
					t[ls[u]]=0;
					tag[ls[u]]=1;
				}
			}
			
			if(!tag[rs[u]]){
				t[rs[u]]=r-mid-t[rs[u]];
				tag[rs[u]]=3;
			}
			else{
				if(tag[rs[u]]==1){
					t[rs[u]]=r-mid;
					tag[rs[u]]=2;
				}
				else{
					t[rs[u]]=0;
					tag[rs[u]]=1;
				}
			}
		}
		tag[u]=0;
	}
	inline void change(int u,int l,int r,int ll,int rr,int k){
		if(ll<=l&&r<=rr){
			if(k==3){
				if(tag[u]==3){
					t[u]=r-l+1-t[u];
					tag[u]=0;
				}
				else{
					if(!tag[u]){
						t[u]=r-l+1-t[u];
						tag[u]=3;
					}
					else{
						if(tag[u]==1){
							t[u]=r-l+1;
							tag[u]=2;
						}
						else{
							t[u]=0;
							tag[u]=1;
						}
					}
				}
			}
			else{
				t[u]=(r-l+1)*(k-1);
				tag[u]=k;
			}
			return ;
		}
		down(u,l,r);
		if(ll<=mid) change(ls[u],l,mid,ll,rr,k);
		if(rr>mid) change(rs[u],mid+1,r,ll,rr,k);
		up(u);
	}
	inline int query(int u,int l,int r){
		if(l==r){
			if(t[u]==r-l+1){
				return 0;
			}
			return l;
		}
		down(u,l,r);
		if(t[ls[u]]<mid-l+1) return query(ls[u],l,mid);
		else return query(rs[u],mid+1,r);
	}
	#undef mid
}
using namespace Sm_tree;
signed main(){
	cin>>n;
	for(int i=1; i<=n;i++){
		scanf("%lld%lld%lld",&f,&l,&r);
		if(f==1) f=2;
		else if(f==2) f=1;
		change(1,L,R,l,r,f);
		ans=query(1,L,R);
		if(!ans){
			printf("1000000000000000001\n");
		}
		else{
			printf("%lld\n",query(1,L,R));
		}
	}
	return 0;
}
2023/8/18 21:50
加载中...