题解:SP138 POSTERS - Election Posters

Sol

Subtask 1

有一种简单的方式:将所有的海报先贴上去,然后在看每个位置是哪一张海报。

这个时间复杂度是 O(T(rl)log(rl))O(T(r-l)\log (r-l)) 的,肯定会 TLE。

Subtask 2

因为 nn 很小,所以将其离散化即可。

时间复杂度 O(Tnlogn)O(Tn\log n),非常充裕。

code

#include<iostream>
#include<map>
#include<algorithm>
using namespace std;
int n=800005;
struct Segment_tree{
	int a[800005],w[4*800005],lzy[4*800005];
	void pushup(int u)
	{
		w[u]=w[u<<1]+w[u<<1|1];
	}
	void build(int u=1,int l=1,int r=n)
	{
		if(l==r)
		{
			w[u]=a[l];
			return;
		}
		int mid=(l+r)/2;
		build(u<<1,l,mid);
		build(u<<1|1,mid+1,r);
		pushup(u);
	}
	bool InRangeOf(int L,int R,int l,int r)
	{
		return (l<=L)&&(R<=r);
	}
	bool OutRangeOf(int L,int R,int l,int r)
	{
		return (L>r)||(R<l);
	}
	void maketag(int u,int len,int x)
	{
		w[u]=x*len;
		lzy[u]=x;
	}
	void pushdown(int u,int l,int r)
	{
		int mid=(l+r)/2;
		if(lzy[u]){maketag(u<<1,mid-l+1,lzy[u]);
		maketag(u*2+1,r-mid,lzy[u]);}
		lzy[u]=0;
	}
	void update(int l,int r,int x,int u=1,int L=1,int R=n)
	{
		if(InRangeOf(L,R,l,r)) maketag(u,R-L+1,x);
		else if(!OutRangeOf(L,R,l,r))
		{
			int mid=(L+R)/2;
			pushdown(u,L,R);
			update(l,r,x,u<<1,L,mid);
			update(l,r,x,u<<1|1,mid+1,R);
			pushup(u);
		}
	}
	int query(int l,int r,int u=1,int L=1,int R=n)
	{
		if(InRangeOf(L,R,l,r)) return w[u];
		else if(!OutRangeOf(L,R,l,r))
		{
			int mid=(L+R)/2;
			pushdown(u,L,R);
			return query(l,r,u<<1,L,mid)+query(l,r,u<<1|1,mid+1,R);
		}
		else return 0;
	}
}a;
map<int,int>dy,py;
int tot=0,p[1000005],l[1000005],r[1000005];
bool f[1000005];
void lsh()
{
	sort(p+1,p+tot+1);
	int len=unique(p+1,p+tot+1)-p-1;
	for(int i=1;i<=len;i++) dy[p[i]]=i,py[i]=p[i];
}
int Main()
{
	int m,ans=0;
	cin>>m;
    for(int i=1;i<=1000000;i++) f[i]=0;
	for(int i=1;i<=m;i++)
	{
		cin>>l[i]>>r[i];
		p[++tot]=l[i];
		p[++tot]=r[i];
	}
	lsh();
	for(int i=1;i<=m;i++) l[i]=dy[l[i]],r[i]=dy[r[i]];
	for(int i=1;i<=n;i++) a.a[i]=0;
	a.build();
	for(int i=1;i<=m;i++) a.update(l[i],r[i],i);
	for(int i=1;i<=n;i++)
	{
		int x=a.query(i,i);
		if(f[x]==0&&x!=0)
		{
			f[x]=1;
			ans++;
		}
	}
	cout<<ans<<endl;
	for(int i=1;i<=m;i++)
		dy[py[l[i]]]=dy[py[r[i]]]=0,py[l[i]]=py[r[i]]=0;
	return 0;
}
signed main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);cout.tie(0);
	int T;
	cin>>T;
	for(;T--;Main());
	return 0;
}
posted @ 2024-11-13 14:22  sLMxf  阅读(14)  评论(0)    收藏  举报  来源