线段树练习题一(离散化做法)

Time Limit:10000MS Memory Limit:65536K
Total Submit:228 Accepted:76
Case Time Limit:1000MS


Description
桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?
线段树练习题一(离散化做法)_第1张图片


Input

Output


Sample Input
20 //桌面总宽度
4 //盒子数量
1 5
3 8
7 10
13 19

Sample Output
15


Hint
数据范围
1 < = n < = 100000 , 1 < = m < = 100000 1<=n<=100000,1<=m<=100000 1<=n<=100000,1<=m<=100000,保证坐标范围为 [ 1 , n ] [1,n] [1,n].


解题思路
这道题也算模板题了吧,可以用线段树做,离散化做会很慢,所以安利线段树做法。


代码
离散化

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<cmath>
using namespace std;
int n,l,ans,x[100010],y[100010],a[300000];
int main(){
	scanf("%d%d",&l,&n);
	for(int i=1;i<=n;i++)
	{
		scanf("%d%d",&x[i],&y[i]);
		a[2*i-1]=x[i];
		a[2*i]=y[i];
	}
	sort(a+1,a+2*n+1);
	for(int i=1;i<=n*2;i++)
	{
		for(int j=1;j<=n;j++)
		{
			if(a[i]>x[j]&&a[i]<=y[j])
			{ 
				ans+=a[i]-a[i-1];
				break; 
			} 
		} 
	} 
	printf("%d",ans);
}

你可能感兴趣的:(离散化)