【SSL 2644】线段树练习题一【离散化做法】

线段树练习题一

Time Limit:10000MS Memory Limit:65536K
Case Time Limit:1000MS

Description

桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?

Input

在这里插入图片描述

Output

影子总宽度

Sample Input

20 
4  
1 5 
3 8
7 10
13 19

Sample Output

15

分析:

虽说是线段树练习题 其实数据不大也可以用离散化
也算是离散化模板 该方法对线段数较少的的情况有效
较多则由于效率取决于n方 n越大效率越慢
线段树写法

CODE:

#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,ans,x[100001],y[100001],a[300001];
int main(){
	scanf("%d%d",&m,&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,a+n*2+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; 
			}
		}
	} 
	cout<<ans;
	
	return 0;
}

猜你喜欢

转载自blog.csdn.net/dgssl_xhy/article/details/107499565
SSL
今日推荐