为什么RE on test 15???
查看原帖
为什么RE on test 15???
684254
Rain_chr楼主2023/3/6 14:53

动态开点线段树的空间复杂度不是 O(mlogn)O(mlogn) 吗?数组空间开到 N<<6 为什么还不够啊

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	char x=getchar();
	int ans=0,f=1;
	while(x<'0'||x>'9') 	
	{
		if(x=='-')
			f=-1;
		x=getchar();
	}
	while(x>='0'&&x<='9') ans=(ans<<3)+(ans<<1)+x-'0',x=getchar();
	return ans*f;
}
const int N=1e5+10;
struct Trends_Segment_Tree
{
	struct node
	{
		int lt,rt;
		int v;
		int tag1,tag2;
	}a[N<<6];
	int cnt,root; 
	void init()
	{
		cnt=root=1;
	}
	void addtag(int &x,int l,int r,int fa)
	{
		if(!x)
			x=++cnt;
		if(a[fa].tag2)
		{
			a[x].v=(r-l+1)-a[x].v;
			a[x].tag2^=1;
			if(a[x].tag1)
				a[x].tag1=(a[x].tag1==1?-1:1);
		}
		if(a[fa].tag1)
		{
			a[x].v=(r-l+1)*(a[fa].tag1==1);
			a[x].tag1=a[fa].tag1;
		}
	}
	void pushup(int x)
	{
		a[x].v=a[a[x].lt].v+a[a[x].rt].v;
	}
	void pushdown(int x,int l,int r)
	{
		if(l>=r)
			return ;
		int mid=(l+r)>>1;
		addtag(a[x].lt,l,mid,x);
		addtag(a[x].rt,mid+1,r,x);
		a[x].tag1=a[x].tag2=0; 
	}
	void turn(int x,int l,int r,int L,int R)
	{
		if(L<=l&&r<=R)
		{
			if(a[x].tag1)
				a[x].tag1=(a[x].tag1==1?-1:1);
			a[x].tag2^=1; 
			a[x].v=(r-l+1)-a[x].v; 
		}
		else
		{
			pushdown(x,l,r);
			int mid=(l+r)>>1;
			if(L<=mid)
				turn(a[x].lt,l,mid,L,R);
			if(mid+1<=R)
				turn(a[x].rt,mid+1,r,L,R);
			pushup(x);
		}
	}
	void change(int x,int l,int r,int L,int R,int v)
	{
		if(L<=l&&r<=R)
		{
			a[x].tag1=v;
			a[x].v=(r-l+1)*(v==1);
		}
		else
		{
			pushdown(x,l,r);
			int mid=(l+r)>>1;
			if(L<=mid)
				change(a[x].lt,l,mid,L,R,v);
			if(mid+1<=R)
				change(a[x].rt,mid+1,r,L,R,v);
			pushup(x);
		}
	}
	int find(int x,int l,int r)
	{
		if(l==r)
		{
			if(a[x].v==0)
				return l;
			else
				return 1000000000000000001;
		}
		pushdown(x,l,r);	
		int mid=(l+r)>>1;
		if(a[a[x].lt].v<(mid-l+1))
			return find(a[x].lt,l,mid);
		else
			return find(a[x].rt,mid+1,r);
	}
}T;
signed main()
{
	T.init();
	int n=read();
	for(int i=1;i<=n;i++)
	{
		int op=read(),l=read(),r=read();
		if(op==1)
			T.change(T.root,1,1000000000000000000,l,r,1);
		else if(op==2)
			T.change(T.root,1,1000000000000000000,l,r,-1);
		else
			T.turn(T.root,1,1000000000000000000,l,r);
		printf("%lld\n",T.find(T.root,1,1000000000000000000));
	}
	return 0; 
} 
2023/3/6 14:53
加载中...