
线段树练习题一(离散化)
发布日期:2021-05-08 21:50:40
浏览次数:16
分类:精选文章
本文共 1128 字,大约阅读时间需要 3 分钟。
线段树练习题一
Description
桌子上零散地放着若干个盒子,桌子的后方是一堵墙。如右图所示。现在从桌子的前方射来一束平行光, 把盒子的影子投射到了墙上。问影子的总宽度是多少?

Sample Input
20 //桌面总宽度
4 //盒子数量 1 5 3 8 7 10 13 19Sample 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); }
谢谢
发表评论
最新留言
感谢大佬
[***.8.128.20]2025年03月20日 20时12分52秒
关于作者

喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
ubuntu学习笔记-常用文件、命令以及作用(hosts、vim、ssh)
2021-05-08
SLAM学习笔记-求解视觉SLAM问题
2021-05-08
普歌-允异团队-HashMap面试题
2021-05-08
还在一个一个手动安装虚拟机吗?Cobbler自动部署装机一键最小化安装打把游戏就好了
2021-05-08
程序员应该知道的97件事
2021-05-08
create-react-app路由的实现原理
2021-05-08
Linux环境变量配置错误导致命令不能使用(杂谈)
2021-05-08
openstack安装(九)网络服务的安装--控制节点
2021-05-08
shell编程(六)语言编码规范之(变量)
2021-05-08
vimscript学习笔记(二)预备知识
2021-05-08
Android数据库
2021-05-08
HTML基础,块级元素/行内元素/行内块元素辨析【2分钟掌握】
2021-05-08
STM8 GPIO模式
2021-05-08
omnet++
2021-05-08
23种设计模式一:单例模式
2021-05-08
Qt中的析构函数
2021-05-08
C语言实现dijkstra(adjacence matrix)
2021-05-08
三层框架+sql server数据库 实战教学-徐新帅-专题视频课程
2021-05-08
【单片机开发】智能小车工程(经验总结)
2021-05-08