博客
关于我
线段树练习题一(离散化)
阅读量:392 次
发布时间:2019-03-05

本文共 1128 字,大约阅读时间需要 3 分钟。

线段树练习题一

Description

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

在这里插入图片描述

Sample Input

20 //桌面总宽度

4 //盒子数量
1 5
3 8
7 10
13 19

Sample Output

15

Hint

数据范围

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

题目分析

这道题目是一个经典的离散化模型。在这里,我们略去某些处理的步骤,直接分析重点问题,可以把题目抽象地描述如下:x轴上有若干条线段,求线段覆盖的总长度

在这里插入图片描述

解题思路

基本思想:先把所有端点坐标从小到大排序,

将坐标值与其序号一一对应。这样便可以将原先的坐标值转化为序号后,对其应用前一种算法,再将最后结果转化回来得解。该方法对于线段数相对较少的情况有效,时间复杂度(n^2)

b [10000,20000]   [30000,50000]   [40000,60000]   [50000,60000]a排序得10000,20000,30000,40000,50000,50000,60000,60000对应得 1       2      3       4     5      6     7     8[1,2]              [3,5]                    [4,7]                   [6,8]

AC代码

#include
#include
#include
using namespace std;int n,m,s,a[200005],b[100005][3];int main(){ scanf("%d%d",&n,&m); for(int i=1;i<=m;i++) { scanf("%d%d",&a[2*i-1],&a[2*i]); b[i][1]=a[2*i-1];//离散化 b[i][2]=a[2*i]; } sort(a+1,a+1+2*m); //排序 for(int i=2;i<=2*m;i++) for(int j=1;j<=m;j++) if(b[j][1]
<=b[j][2])//如果覆盖 { s+=a[i]-a[i-1];//累加区间的值 break; } printf("%d",s); }

谢谢

转载地址:http://hrpzz.baihongyu.com/

你可能感兴趣的文章
Unity平台 | 快速集成华为性能管理服务
查看>>
做好付费预测,揭开用户转化的关键秘密
查看>>
华为预测服务新版本上线!自定义预测轻松满足您的个性化需求
查看>>
详细实例教程!集成华为虚假用户检测,防范虚假恶意流量
查看>>
对模拟器虚假设备识别能力提升15%!每日清理大师App集成系统完整性检测
查看>>
HMS Core Discovery-七个推送技巧带你玩转App运营
查看>>
使用Power BI构建数据仓库与BI方案
查看>>
pytest封神之路第二步 132个命令行参数用法
查看>>
字符集其实很简单
查看>>