【离散化】某虚伪的线段树练习题一

你以为我是线段树,其实我是离散化哒~

咳咳。。。


桌子上零散地放着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);
} 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值