我有很多问号
查看原帖
我有很多问号
788951
TLE_AK楼主2024/7/30 18:46

本题是否可以在扫描线中维护线段树(位置)套主席树(颜色)啊qwq 这样时空都是 nlog⁡2nn \log^2n 的吧。
但我好像Wa#10了QWQ
能不能告诉我可行/hack (

#include<bits/stdc++.h>
using namespace std;


namespace acac
{
	int tree[16000010],son[16000010][2],rt[800010];

	int tot,n;
	
	
	
	void pu(int u)
	{
		tree[u]=tree[son[u][0]]+tree[son[u][1]];
	}
	
	void c(int u,int l,int r,int w,int num)
	{
		if(l==r)
		{
			tree[u]+=num;
			return ;
		}
		
		int mid=(l+r)>>1;
		if(w<=mid)
		{
			if(!son[u][0])son[u][0]=++tot;
			c(son[u][0],l,mid,w,num);
		}
		else 
		{
			if(!son[u][1])son[u][1]=++tot;
			c(son[u][1],mid+1,r,w,num);
		}
		pu(u);
	}
	
	void modify(int u,int l,int r,int L,int R,int k,int num)
	{
		if(L>R||L>r||l>R)return ;
		if(L<=l&&R>=r)
		{
			
			if(!rt[u])rt[u]=++tot;
			//cout<<l<<' '<<r<<' '<<rt[u]<<endl;
			c(rt[u],1,n,k,num);
			return ;
		}
		int mid=(l+r)>>1;
		modify(2*u,l,mid,L,R,k,num);
		modify(2*u+1,mid+1,r,L,R,k,num);
	}
	
	int re=0;
	int qr(int u,int l,int r)
	{
		if(l==r)return tree[u]?l:0;
	//	cout<<tree[son[u][1]]<<endl;
		int mid=(l+r)>>1;
		if(tree[son[u][1]])return qr(son[u][1],mid+1,r);
		return qr(son[u][0],l,mid);
	}
	
	int Ans[100010];
	
	void qrery(int u,int l,int r,int L,int R,int re)
	{
		if(L>R||L>r||l>R)return ;
		if(rt[u])re=max(re,qr(rt[u],1,n));
		//cout<<l<<' '<<r<<' '<<re<<endl;
		if(L<=l&&R>=r)
		{
			Ans[re]=1;
			return ;
		}
		

		int mid=(l+r)>>1;
		qrery(2*u,l,mid,L,R,re);
		qrery(2*u+1,mid+1,r,L,R,re);
	}
	 
	int ls[400010];
	 
	struct node
	{
		int x1,x2,y,num,op;
	}A[200010],Z[200010];
	
	map<int,int>mp;
	
	bool cmp(node a,node b)
	{
		if(a.y==b.y)return a.num<b.num;
		return a.y<b.y;
	}
	 
	
	 
	int main()
	{
		scanf("%d",&n);
		//左下右上 
		int len=4*n;
		for(int i=1;i<=n;i++)
		{
			scanf("%d%d%d%d",&A[i].x1,&A[i].y,&A[i].x2,&A[i+n].y);
			ls[i]=A[i].x1;
			ls[i+n]=A[i].x2;
			ls[i+n*2]=A[i].x1-1;
			ls[i+n*3]=A[i].x2-1;
			A[i].op=A[i+n].op=i;
		//	if(i==139)cout<<A[i].x1<<' '<<A[i].x2<<endl;
			A[i+n].x1=A[i].x1;
			A[i+n].x2=A[i].x2;
			
			A[i].num=1,A[i+n].num=-1;
		}
		sort(ls+1,ls+len+1);
		int cnt=0;
		ls[0]=-1e9-10;
		for(int i=1;i<=len;i++)
		{
			if(ls[i]!=ls[i-1])cnt++;
			mp[ls[i]]=cnt;
			
	//		cout<<cnt<<' ';
		}
	//	cout<<endl;
		sort(A+1,A+2*n+1,cmp);
		for(int i=1;i<=n*2;i++)
		{
			int zw=0;
			while(A[i+1].y==A[i].y)
			{
				modify(1,1,cnt,mp[A[i].x1],mp[A[i].x2],A[i].op,A[i].num);
				Z[++zw].y=mp[A[i].x1];
				Z[zw].num=mp[A[i].x2];
				//
			//	cout<<Z[zw].y<<' '<<Z[zw].num<<endl;
				i++;
			}
			
			modify(1,1,cnt,mp[A[i].x1],mp[A[i].x2],A[i].op,A[i].num);
			Z[++zw].y=mp[A[i].x1];
			Z[zw].num=mp[A[i].x2];
		//	cout<<Z[zw].y<<' '<<Z[zw].num<<endl;
			sort(Z+1,Z+1+zw,cmp);
			while(zw)
			{
				if(zw==1||Z[zw].y!=Z[zw-1].y||Z[zw].num!=Z[zw-1].num)qrery(1,1,cnt,Z[zw].y,Z[zw].num,0);
				zw--;
			}
//			for(int i=1;i<=n;i++)
//			{
//				cout<<Ans[i]<<' ';
//
//			}
//			cout<<endl;
		}
		int ans=1;
		for(int i=1;i<=n;i++)
		{
		//	cout<<i<<": "<<Ans[i]<<'\n';
			ans+=Ans[i];
		}
		cout<<ans;
		return 0;
	}
}



int main()
{

	acac::main();
	return 0;
}
/*
3
2 1 4 2
1 1 2 2
4 1 5 2
*/
2024/7/30 18:46
加载中...