luogu 1496

这题应该就是离散化模板题了
首先我们先把所有坐标离散化,然后用类似扫描线的思想,把几个线段交叉起来的分成一小段一小段,然后求和。然后怎么判断我们需不需要继续求和呢?(就是每一长段有没有间隔)那就利用前缀和的思想,在起点+1,终点-1,这样就可以了,剩下的就是写代码了

#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
int n,a[20005],b[20005],c[40010],add[40010],cnt,num,ans;
int main()
{
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		scanf("%d %d",&a[i],&b[i]);
		c[++cnt]=a[i];
		c[++cnt]=b[i];
	}
	sort(c+1,c+cnt+1);
	int len=unique(c+1,c+cnt+1)-(c+1);
	for(int i=1;i<=n;i++)
	{
		a[i]=lower_bound(c+1,c+cnt+1,a[i])-c;
		b[i]=lower_bound(c+1,c+cnt+1,b[i])-c;
		add[a[i]]++;
		add[b[i]]--;
	}
	for(int i=1;i<=cnt;i++)
	{
		num+=add[i];
		if(num>0)
		{
			ans+=c[i+1]-c[i];
		}
	}
	cout<<ans;
 } 

猜你喜欢

转载自blog.csdn.net/qq_37073764/article/details/102995856
今日推荐