洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统

news/2025/1/16 18:00:53/文章来源:https://www.cnblogs.com/jcwy/p/18674205

原题链接:https://www.luogu.com.cn/problem/P3168

题意解读:一个任务管理系统,能够查询在某个时间点运行的任务中优先级最小的 k个任务的优先级之和。

解题思路:

由于总时间n不超过100000,考虑针对所有时刻建立可持久化线段树,根节点为root[i]的线段树维护时刻i的任务情况,节点区间表示优先级,节点cnt表示某个优先级的任务数量,节点sum表示某个优先级的任务的优先级之和。

对于一个任务三元组(s, e, p),可以分解来看,对s时刻的线段树应该针对值p的数量加1,而e + 1时刻的线段树应该针对值p的数量减1。

查询操作只需要查询时刻x的一棵线段树,要查询前k小的优先级之和,需要注意一点:如果有相同优先级的任务超过k个,那么递归时会到叶子节点,此时返回的优先级之和应该是该叶子节点的优先级 * k。

其余代码都是可持久化线段树的正常操作。

100分代码:

#include <bits/stdc++.h>
using namespace std;const int N = 100005, P = 1e7;
typedef long long LL;struct Task 
{int t; // 任务时间bool start; // 是否是任务开始时间 true:开始 false:结束LL p; // 任务优先级
};
vector<Task> tk[N]; // 每个时刻所有的任务,开始、结束拆分处理struct Node 
{int L, R;int cnt; // 任务数量LL sum; // 优先级和
} tr[N * 50]; // 线段树节点int root[N], idx; // 线段树根节点,节点编号
int m, n;//通过复制节点的方式更新线段树,将根为pre的线段树中值v的数量加num
int update(int pre, int l, int r, int v, int num) 
{int u = ++idx;tr[u] = tr[pre]; // 复制节点tr[u].cnt += num;tr[u].sum += num * v;if (l == r) return u;int mid = (l + r) >> 1;if (v <= mid) tr[u].L = update(tr[u].L, l, mid, v, num);else tr[u].R = update(tr[u].R, mid + 1, r, v, num);return u;
}//在根为u的线段树中查询前k小任务的优先级和
LL query(int u, int l, int r, int k) 
{if (tr[u].cnt <= k) return tr[u].sum; // u节点所在树所有任务数量小于等于k的全部选if(l == r) return l * k; // 考虑到会有相同优先级任务数量超过k个,在递归到叶子节点时,则只取k个该叶子节点的值int mid = (l + r) >> 1; if (tr[tr[u].L].cnt >= k) return query(tr[u].L, l, mid, k); else return tr[tr[u].L].sum + query(tr[u].R, mid + 1, r, k - tr[tr[u].L].cnt);
}int main() {cin >> m >> n;int s, e, p;for (int i = 1; i <= m; i++) {cin >> s >> e >> p;tk[s].push_back({s, true, p});tk[e + 1].push_back({e + 1, false, p});}for (int i = 1; i <= n; i++) {root[i] = root[i - 1];for (auto task : tk[i]) {if (task.start) root[i] = update(root[i], 1, P, task.p, 1);else root[i] = update(root[i], 1, P, task.p, -1);}}LL pre = 1;int x, a, b, c;for (int i = 1; i <= n; i++) {cin >> x >> a >> b >> c;int k = 1 + (a * pre + b) % c;pre = query(root[x], 1, P, k);cout << pre << endl;}return 0;
}

 

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

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

相关文章

wordpress 从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。此响应不是合法的JSON响应。解决方法.210721

两种报错方式: 1.此响应不是合法的JSON响应。 2.从服务器收到预料之外的响应。此文件可能已被成功上传。请检查媒体库或刷新本页。 情况:媒体服务器上传小文件没问题,大一点的文件报这个错误。 原因:这是因为nginx限制了请求体大小 方案:需要在nginx的虚拟机配置文件中添加…

docker containner挂掉,无法exec进入bash,如何修改文件的终极解决方法.210730

场景: Nginx在bash里面配置的时候挂掉了,然后docker start不起来,exec bash进不去,造成无法再改里面的文件了 解决方法: 1,docker ps –a 可以查到所有docker,包括没有运行的,找到containner ID [root@hecs-29489 ~]# docker ps -a CONTAINER ID IMAGE COMMAND…

HP惠普笔记本重装系统无法引导无法进操作系统的终极解决方法.210804

F9进入BIOS-先进(Advanced)-安全引导配置- 启用传统支持和禁用安全引导.zstitle { width: 280px; text-align: center; font-size: 26px } .zsimgweixin { width: 280px } .zsimgali { width: 280px; padding: 0px 0px 50px 0px } .zsleft { float: left } .zsdiv { display:…

Feign与SpringCloud LoadBalancer实现负载均衡源码分析

SpringCloud LoadBalancer 众所周知,SpringCloud体系中负载均衡的组件有SpringCloud LoadBalancer和Ribbon,Ribbon也在逐渐的被替代掉,因为SpringCloud LoadBalancer性能更高,支持响应式 下面通过hard-coded体现一下SpringCloud的负载均衡 首先有一个【say-hello】服务,提…

JS — 判断语句与循环语句

js的判断语句与循环语句...(* ̄0 ̄)ノ判断语句JavaScript中的if-else语句与C++、Python、Java中类似。直接输出到控制台:test.html中的内容为: <script type="module">let score = 90;if (score >= 85) {console.log("A");} else if (score &g…

Living-Dream 系列笔记 第92期

最小路径点覆盖 在一张 DAG 上,求一个路径的集合,使得它们两两不相交,且覆盖所有的点。 结论:答案即为 \(总点数-最大匹配\)(于是 \(总点数-最大匹配=总点数-最小点覆盖=最大独立集=最大团=最小路径点覆盖\))。 证明: 不妨转换角度,从研究路径转为研究点。 因为路径两两…

毕设学习第四天之Java的注解和反射

注解(Annotation) Java 注解(Annotation)是一种特殊的语言构造,用于为代码元素(如类、方法、字段等)提供元数据,通常不直接影响程序的逻辑执行。它们可以被编译器、框架或工具解析,用于执行特定操作,如自动化配置、代码生成、验证等。Java 提供了内置的注解(如 @Overr…

Docker安装wikijs wiki系统.210818

1. 拉取mysql8的镜像并运行 docker pull mysqldocker run -d -v /data/mysql/data:/var/lib/mysql -v /data/mysql/conf:/etc/mysql/conf.d --name mysql -e TZ=Asia/Shanghai -e MYSQL\_ROOT\_PASSWORD=1234 -p 3306:3306 mysql:latest2. 进入mysql,创建并修改权限 docker…

重载自动驾驶平板车HAV

随着无人驾驶在封闭场地和干线道路场景的加速落地,港口作为无人化运营的先行者,其场景的复杂度、特殊性对无人化运营的技术提出了各种挑战。为了应对港口无人化运营在实质化落地过程的挑战,经纬恒润借助自身在无人驾驶领域的深厚积累与实践,研发了全新的第三代重载自动驾驶…

【深度学习教程】Python 如何用 LSTM 做情感分析?小白也能上手!

Hello 大家好,今天我们来聊一个超热门的话题——**LSTM 网络在情感分析中的应用**!想象一下,通过深度学习,你的代码可以读懂人类情绪,知道“我爱你”和“我讨厌你”的区别,是不是很酷?今天这篇文章,我会手把手教你从零开始,用 Python 和 Keras 实现一个**基于 LSTM 的…

安川YASKAWA机器人主板维修方法合集

安川机械手板卡故障分析与YASKAWA机械臂主板维修步骤 1. 确认故障现象:首先,我们需要详细了解安川机器人主板故障现象,包括但不限于工作异常、运行错误、速度变慢等。 2. 拆卸主板:根据故障现象,找到相应的机械手电路板故障部位,并小心地将主板拆卸下来,确保不损坏其他部…

lstm理解

batch_size:表示再这样的数据集中有多少数据表单,本列中为3张表单,构成3维数据。若是10张表单,则10张表单堆叠在一起,构成3维数据。time_step:表示在3维时间序列中,每张表有多少行,每个时间序列有多少点,时间点实际就是时序序列的序列长度,成为时间步。input_diensio…