题目
因为宣传栏和海报的高度都是一样的,所以宣传栏可以被视作长度为L的一段区间,且有N张海报按照顺序依次贴在了宣传栏上,其中第i张海报贴住的范围可以用一段区间[a_i, b_i]表示,其中a_i, b_i均为属于[0, L]的整数,而一张海报能被看到当且仅当存在长度大于0的一部分没有被后来贴的海报所遮挡住。那么问题就来了:究竟有几张海报能被看到呢?
对于100%的数据,满足N<=10^5,L<=10^9,0<=a_i
思路
L的范围太大了。而个数N只有10^5。将L的10^9范围映射到10^5就可以很好的解决这个问题了。、
代码
#include<cstdio>
#include<map>
using namespace std;
const int MAXN=100000+5;
int N,M=0,L,l[MAXN],r[MAXN],fa[MAXN*2];
map<int,int> t;
int find(int x)
{
return fa[x]==x?x:fa[x]=find(fa[x]);
}
int main()
{
scanf("%d%d",&N,&L);
t[0] = 1;
t[L] = 1;
for(int i=1;i<=N;i++)
{
scanf("%d%d",&l[i],&r[i]);
t[l[i]]=1;
t[r[i]]=1;
}
for(map<int,int>::iterator it=t.begin();it!=t.end();it++)
{
M++;
fa[M]=M;
it->second=M;
}
int ans=0;
for(int i=N;i>0;i--)
{
int x=t[l[i]];
int y=t[r[i]]-1;
y=find(y);
if(y>=x)
{
ans++;
while(y>=x)
{
fa[y]=y-1;
y=find(y);
}
}
}
printf("%d",ans);
return 0;
}