关于此题[ABC389F] Rated Range 线段树二分的一些总结

news/2025/1/22 13:09:28/文章来源:https://www.cnblogs.com/lwiwi/p/18685602

传送门

题目大意

  • 依次给定\(n\)个区间,并给定\(q\)个数,每个数依次经过这些区间时若在区间中则加1,问最后每个数变成了多少。

做法

  • 显然如果直接模拟的话时间复杂度肯定是会炸的。
  • 首先我们注意到这道题是可以离线处理的,并且对于所有询问的数,我们如果先对他们排好序,在每个数都各自依次经过所给的区间之后,最后的序列依然是非递减的(可以自己试着感性证明一下),于是问题就变成了:依次对于所给的区间,在一个有序的数列当中找到所有属于这个区间的数,并使他们加1。而所有属于这个区间的数在这个数列中一定是连续的(因为这个数列是非递减的),那么就引申出了做法。
  • 首先提供一种树状数组的思路,我们可以用二分来找到当前这个数列中第一个小于当前区间左端点\(l[i]\)的数的位置第一个大于当前区间右端点\(r[i]\)的数的位置,然后利用差分进行每次的修改。由于在二分的过程中对于每个数的判断都需要树状数组求差分前缀和,所以时间复杂度是\(O(nlog^{2}n)\)的。
  • 再给出一种线段树二分的做法。我们可以利用线段树来维护所给的询问排好序后的数列中最小值和最大值,在每次区间修改操作时,对于当前区间,如果当前区间最小值不比\(l[i]\)小,最大值不比\(r[i]\)大,那么当前区间肯定是需要直接全部加1的。而对于其他情况,线段树中当前区间的左儿子区间的数一定是比右儿子区间的数小的,所以如果\(l[i]\)比左儿子区间的最大值小那么说明左儿子区间存在需要修改的值,如果\(r[i]\)比右儿子区间的最小值大那么说明右儿子区间存在需要修改的值,再往后递归即可。
  • 最后就是数组一定不要开小了

代码

#include<bits/stdc++.h>using namespace std;long long t;
const long long N = 5e5 + 10;
long long n,q;
long long l[N],r[N],add[3000010],minv[3000010],maxn[3000010];
long long ans[600010],p[3000010];
struct node {long long num,pos;bool operator < (const node &a) const {return num < a.num;}
}query[600010];void build(long long k,long long l,long long r) {if(l == r) {minv[k] = maxn[k] = query[l].num;p[k] = query[l].pos;return;}long long mid = (l + r) >> 1;build(k * 2,l,mid);build(k * 2 + 1,mid + 1,r);minv[k] = min(minv[k * 2],minv[k * 2 + 1]);maxn[k] = max(maxn[k * 2],maxn[k * 2 + 1]);
}void Add(long long k,long long l,long long r,long long v) {minv[k] += v;maxn[k] += v;add[k] += v;
}void pushdown(long long k,long long l,long long r,long long mid) {Add(k * 2,l,mid,add[k]);Add(k * 2 + 1,mid + 1,r,add[k]);add[k] = 0;
}void modify(long long k,long long l,long long r,long long x,long long y) {if(l == r) {if(minv[k] >= x && maxn[k] <= y) minv[k]++,maxn[k]++;return;}if(x <= minv[k] && maxn[k] <= y) {minv[k]++;maxn[k]++;add[k]++;return ;}long long mid = (l + r) >> 1;pushdown(k,l,r,mid);if(x <= maxn[k * 2]) modify(k * 2,l,mid,x,y);if(y >= minv[k * 2 + 1]) modify(k * 2 + 1,mid + 1,r,x,y);minv[k] = min(minv[k * 2],minv[k * 2 + 1]);maxn[k] = max(maxn[k * 2],maxn[k * 2 + 1]);
}void rbuild(long long k,long long l,long long r) {if(l == r) {ans[p[k]] = maxn[k];return;}long long mid = (l + r) >> 1;pushdown(k,l,r,mid);rbuild(k * 2,l,mid);rbuild(k * 2 + 1,mid + 1,r);
}void solve() {cin >> n;for(long long i = 1;i <= n;i++) cin >> l[i] >> r[i];cin >> q;for(long long i = 1;i <= q;i++) {cin >> query[i].num;query[i].pos = i;}sort(query+1,query+1+q);build(1,1,q);for(long long i = 1;i <= n;i++)modify(1,1,q,l[i],r[i]);rbuild(1,1,q);for(long long i = 1;i <= q;i++) cout << ans[i] << '\n';
}signed main() {ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);t = 1;while(t--) solve();return 0;
}

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

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

相关文章

manim边做边学--淡入淡出变换

今天介绍Manim中用于淡入淡出变换的3个动画类:FadeToColor:聚焦于对象颜色的平滑转换,通过渐变增强视觉效果 FadeTransform:实现不同对象之间的渐变替换,让元素转换更加连贯 FadeTransformPieces:突出将对象碎片化并对各部分单独变换,适用于复杂物体的分解重组这三者都在…

抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞

抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞抽取网易云音乐热门评论:html+css+python+js 音乐与灵魂的碰撞 代码链接不说废话,上代码!!! get.py # get.py import urllib.request import urllib.error import urllib.parse import json# 抓取网易云音乐指…

快手HoME多任务论文

论文链接:HoME: Hierarchy of Multi-Gate Experts for Multi-Task Learning at Kuaishou 背景 论文指出现在的MMOE/PLE模型存在以下几个问题: 1. 专家崩溃:专家的输出分布存在显着差异,并且一些专家使用 ReLU 的零激活率超过 90%,使得门网络很难分配公平的权重来平衡专家…

Linux 笔记

目录Linux 目录结构Linux 目录与 Windows 目录对比Windows 目录结构Linux 目录结构Linux 世界里---一切皆文件Linux 目录结构详解/bin/sbin/home/root/boot/lib/etc/usr/proc, 别动/srv, 别动/sys, 别动/tmp/dev/media/mnt/opt/usr/local/var/selinux常用快捷键案例常用命令开机…

Prometheus+Grafana 监控搭建

Prometheus+Grafana 监控搭建 Prometheus 是使用 Golang 开发的,安装和运行都非常简单,只需直接运行可执行文件即可。个人认为,只要理解了 Prometheus 的架构图,整体概念就会变得非常清晰。 Prometheus 做的挺成熟,使用非常简单,主要是想自己记录一下,方便后续记忆。 1、…

【防火墙】防火墙监控没做好,断网2小时准备提桶跑路

防火墙告警:该业务CPU负荷过多(81>= 80) ,发现吞吐量超过设备性能阈值,导致网络特别卡,客户端体现就是偶尔网络中断。 之前有篇文章是针对华三的防火墙指标数据采集做了介绍说明,可点击这里查看 网络监控:华三防火墙监控 这篇文章了解,在防火墙可观测性领域目前案例分…

nRF21540—低功耗蓝牙,蓝牙mesh、Thread和Zigbee和2.4 GHz私有协议范围扩展射频前端模块

nRF21540是一款射频前端模块(FEM),可用于改善短距离无线产品的传输范围和连接鲁棒性。作为一款辅助性设备,nRF21540是一种“即插即用型”的无线传输范围扩展器,可与nRF52和nRF53系列的高级多协议无线SoC搭配使用,所需的外部器件数量非常少。 nRF21540的+13dB RX增益和低…

Transformer 学习与解读

LLM学习笔记 注意力机制 sequence to sequence (seq2seq)输入N个向量,输出任意可能数量的向量(由机器决定);如果输出N个向量的任务就叫做Sequence Labeling 李沐课程讲义:https://zh-v2.d2l.ai/chapter_attention-mechanisms/self-attention-and-positional-encoding.ht…

JDK中的可视化故障处理工具

JDK提供了几个功能集成度更高的可视化工具,我们可以使用这些可视化工具以更加便捷的方式进行进程故障诊断和调试工作。 今天就简单介绍一些JDK中的可视化故障处理工具。 JHSDB:基于服务性代理的调试工具 在说JHSDB之前,先来了解一下JCMD和JHSDB这两个集成式的多功能工具箱,…

ExKMP Z函数

讲解Z函数(ExKMP),附模板及例题更新日志 20250122:开工。思路 我们定义 \(z_i\) 表示从 \(i\) 开始的后缀与整个字符串的最长公共前缀长度。 考虑它的作用,假如我们要字符串匹配,将模式串接在前面并以特殊字符分隔,然后 \(O(n)\) 遍历原串,当 \(z_i=|T|\)(\(T\) 为模式…

【资产梳理】 攻击面资产梳理可视化工具

免责声明: ⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!确定攻击面对于防御和进攻网络安全团队都至关重要。毫无疑问,可视化映射比简单的列表更有效。专家可以快速掌握…

OpenWRT24.10旁路由挂载USB移动硬盘,配置Samba4,作为NAS使用,解决中文不显示,乱码,解决断电重启后挂载失败问题

1. 为何选择OpenWRT 24.10,及如何配置旁路由,或者IPv6地址 看这篇:参OpenWRT24.10配置作为旁路由,并配置获取IPv4和IPv6地址 使用的OpenWRT固件是从这里下载的:https://openwrt.ai/ 2.挂载大容量USB移动硬盘 2.1 安装必备插件 kmod-fs-ntfs3 kmod-fs-ext4 kmod-fs-exfat…