首页 > 其他分享 >洛谷题单指南-线段树的进阶用法-P3168 [CQOI2015] 任务查询系统

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

时间:2025-01-16 17:59:33浏览次数:1  
标签:优先级 进阶 P3168 int 洛谷题 线段 tr 任务 节点

原题链接: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;
}

 

标签:优先级,进阶,P3168,int,洛谷题,线段,tr,任务,节点
From: https://www.cnblogs.com/jcwy/p/18674205

相关文章

  • 史上最详细的vue进阶
    vue进阶01过滤器Vue.js允许你自定义过滤器,可被用于一些常见的文本格式化。​功能:对要显示的数据进行特定格式化后再显示​注意:并没有改变原本的数据,可是产生新的对应的数据基本语法定义过滤器你可以在一个组件的选项中定义本地的过滤器(局部):filters:{......
  • 洛谷题单指南-线段树的进阶用法-P2617 Dynamic Rankings
    原题链接:https://www.luogu.com.cn/problem/P2617题意解读:动态求区间第k小问题。解题思路:树套树的典型应用,具体阐述参考:https://www.cnblogs.com/jcwy/p/18640914100分代码:#include<bits/stdc++.h>usingnamespacestd;constintN=100005;structOp{charop;......
  • AI 编程工具—Cursor进阶使用 阅读开源项目
    AI编程工具—Cursor进阶使用阅读开源项目首先我们打开一个最近很火的项目browser-use,直接从github上克隆即可索引整个代码库这里我们使用@Codebase这个选项会索引这个代码库,然后我们再选上这个项目的README.md文件开始提问@Codebase@README.md这个项目是用......
  • 【进阶教程】轻量级开源VNC本地安装与跨平台远程桌面实战分享——“cpolar内网穿透”
    文章目录前言1.安装TightVNC服务端2.局域网VNC远程测试3.Win安装Cpolar工具4.配置VNC远程地址5.VNC远程桌面连接6.固定VNC远程地址7.固定VNC地址测试前言在工作和生活中,我们经常需要跨越地理界限进行协作或处理事务。这时,远程桌面服务就成了不可或缺的好帮手......
  • PHP语法进阶
    PHP语法进阶数组数组能够在单个变量中存储多个值,并且可以根据键访问其中的值PHP有两种数组:数值数组、关联数组。数值和关联两个词都是针对数组的键而言的。先介绍下数值数组,数值数组是指数组的键是整数的数组,并且键的整数顺序是从0开始,依次类推。数值数组$maoshu=ar......
  • Tauri教程-进阶篇-第二节 命令机制
    “如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》“有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》“维持现状意味着空耗你的努力和生命。”——纪伯伦Tauri技术教程*第五章Tauri的进阶教程第二节命令机制一.......
  • Tauri教程-进阶篇-第一节 自定义启动画面
    “如果结果不如你所愿,就在尘埃落定前奋力一搏。”——《夏目友人帐》“有些事不是看到了希望才去坚持,而是因为坚持才会看到希望。”——《十宗罪》“维持现状意味着空耗你的努力和生命。”——纪伯伦Tauri技术教程*第五章Tauri的进阶教程第一节自定义启动画面......
  • K8S之Pod进阶
    文章目录容器容器的状态pod实例配置镜像仓库拉镜像默认值特别说明容器重启策略Init容器Init容器优势Init容器实例特殊说明临时容器hook钩子函数容器探针何时该使用启动探针Pause(Infra)容器背景实现Pause容器的作用PodPreset如何工作容器容器的状态容器的状......
  • 敏捷团队的进阶之路:工具的实践与应用
    ​在当今快节奏、高竞争的商业环境中,“敏捷”已经从一种开发模式演变为广泛适用于各行业的工作哲学。然而,对于很多团队来说,敏捷并不仅仅是学习几个概念或框架,更是如何在日常实践中将这些理念真正落地。而在这个过程中,敏捷工具的作用显得尤为重要。为什么敏捷工具成为敏捷落地的......
  • AIGC从入门到实战:进阶:魔法打败魔法,让 AI 自动生成提示词
    AIGC,提示词生成,自然语言处理,深度学习,Transformer,预训练模型,算法原理,实践应用1.背景介绍近年来,人工智能生成内容(AIGC)技术蓬勃发展,以其强大的文本生成能力,在创作、翻译、摘要等领域展现出巨大的潜力。然而,AIGC的应用离不开高质量的提示词,而手工撰写提示词......