你以为我是线段树,其实我是离散化哒~
咳咳。。。
桌子上零散地放着n个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?
Input
第一行,一个m,一个n(废物m)
接下来2-n+1行,每行两个数,分别是盒子的起点和终点。
Output
一个数,影子的总宽度
Sample Input
20 //桌面总宽度
4 //盒子数量
1 5
3 8
7 10
13 19
Sample Output
15
离散,离散,离散~
#include<cstdio>
#include<algorithm>
using namespace std;
int n,m,t,T,ans,qi[100001],zhong[100001],l[200001];
int main(){
scanf("%d%d",&m,&n); //读入
for(int i=1;i<=n;++i){
scanf("%d%d",&qi[i],&zhong[i]); //起点终点
l[++t]=qi[i]; //存
l[++t]=zhong[i];
}
sort(l+1,l+1+t); //排序
t=unique(l+1,l+t+1)-l; //去重
--t; //减一得到去重后正确数量
for(int i=1;i<=t;++i) //每一段轮
for(int k=1;k<=n;++k) //轮盒子
if(qi[k]<=l[i]&&zhong[k]>l[i]){ //如果这一段可以被这个盒子覆盖
ans+=l[i+1]-l[i]; //+
break; //避免重复计算
}
printf("%d",ans);
}