博客
关于我
线段树练习题一(离散化)
阅读量:394 次
发布时间: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/

你可能感兴趣的文章
解决WebRTC中不同的浏览器之间适配的问题
查看>>
深入理解JavaScript函数
查看>>
【spring源码系列】之【xml解析】
查看>>
(在模仿中精进数据可视化07)星球研究所大坝分布可视化
查看>>
(数据科学学习手札02)Python与R在循环语句与条件语句上的异同
查看>>
(数据科学学习手札27)sklearn数据集分割方法汇总
查看>>
(数据科学学习手札40)tensorflow实现LSTM时间序列预测
查看>>
[整理] 哪些集合类是线程安全的?(Java)
查看>>
8 个警示和学习的 5 个阶段
查看>>
c# 图片带水纹波动
查看>>
H5 贪吃蛇源码
查看>>
从零开始学安全(十六)● Linux vim命令
查看>>
从零开始学安全(三十四)●百度杯 ctf比赛 九月场 sqli
查看>>
3389连接痕迹清除
查看>>
发生系统错误 6118
查看>>
阿里巴巴Json工具-Fastjson教程
查看>>
Spring Cloud Gateway - 快速开始
查看>>
Spring Security 实战干货:理解AuthenticationManager
查看>>
Java对象转JSON时如何动态的增删改查属性
查看>>
Python 面向对象进阶
查看>>