线段树练习题一
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;
}