P3168 [CQOI2015]任务查询系统
主席树的模板题
更模板的在这儿:P3834 【模板】可持久化线段树 1(主席树)
形象的说,P3834是“单点修改,区间查询”,P3168是“区间修改,单点查询”
注意!这里只是形象的说,实际上两道题都是静态的
我们联想其他的“区间修改,单点查询”问题,我们都是怎么做的?
差分!
没错,差分,将“区间修改”改成“左端点加,右端点的右边减”的“单点修改”
那么,我们每次“单点查询”就相当于求前缀和,也就是一个“区间查询”
于是我们成功的将P3168转化成了P3834,然后就简单了
几个注意点:
公式 \(K_i=1+(A_i*Pre+B_i)\ mod\ C_i\) 会爆 int,注意开 long long
需要先进行离散化, \(sort+unique\) 即可
主席树要开 \(2*N\ log\ N\) ,其中 \(2\) 是因为差分以后“单点修改”的数量为原来“区间修改”的两倍(我的代码中直接将 N 扩大了一倍)
不要修改第 \(n+1\) 个区间,即修改到第 \(n+1\) 个区间就可以直接 break
在询问到 \(l==r\) 时不能直接返回 \(sum\) 而要返回 \(t[p].s / t[p].c * k\)
#include <bits/stdc++.h>
#define ll long long
#define pii pair<int, int>
#define x first
#define y second
using namespace std;
const int N = 2e5 + 6;
int n, m, pre = 1, b[N], rt[N], tot;
pii a[N];
struct T {
int l, r, c, s;
} t[N*20];
int build(int l, int r) {
int p = ++tot;
if (l == r) return p;
int mid = (l + r) >> 1;
t[p].l = build(l, mid);
t[p].r = build(mid + 1, r);
return p;
}
int change(int o, int l, int r, int p, int k) {
int q = ++tot;
t[q] = t[o];
if (l == r) {
t[q].c += k;
t[q].s += k * b[p];
return q;
}
int mid = (l + r) >> 1;
if (p <= mid) t[q].l = change(t[o].l, l, mid, p, k);
else t[q].r = change(t[o].r, mid + 1, r, p, k);
t[q].c = t[t[q].l].c + t[t[q].r].c;
t[q].s = t[t[q].l].s + t[t[q].r].s;
return q;
}
int ask(int p, int l, int r, int k) {
if (l == r) return t[p].s / t[p].c * k;
int mid = (l + r) >> 1;
if (k <= t[t[p].l].c) return ask(t[p].l, l, mid, k);
else return t[t[p].l].s + ask(t[p].r, mid + 1, r, k - t[t[p].l].c);
}
int main() {
cin >> n >> m;
for (int i = 1; i <= n; i++) {
int p = (i << 1) - 1, q = i << 1;
scanf("%d %d %d", &a[p].x, &a[q].x, &a[p].y);
++a[q].x;
a[q].y = -a[p].y;
b[i] = a[p].y;
}
sort(b + 1, b + n + 1);
int w = unique(b + 1, b + n + 1) - (b + 1);
rt[0] = build(1, w);
sort(a + 1, a + (n << 1) + 1);
int k = 1;
for (int i = 1; i <= (n << 1); i++) {
while (k < a[i].x) {
rt[k+1] = rt[k];
++k;
}
if (k == n + 1) break;
int p = lower_bound(b + 1, b + w + 1, abs(a[i].y)) - b;
rt[k] = change(rt[k], 1, w, p, a[i].y > 0 ? 1 : -1);
}
while (m--) {
int xi, ai, bi, ci;
scanf("%d %d %d %d", &xi, &ai, &bi, &ci);
int ki = ((ll)ai * pre + bi) % ci + 1;
if (t[rt[xi]].c <= ki) printf("%d\n", pre = t[rt[xi]].s);
else printf("%d\n", pre = ask(rt[xi], 1, w, ki));
}
return 0;
}
P3168 [CQOI2015]任务查询系统的更多相关文章
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
- 洛谷 P3168 [CQOI2015]任务查询系统 解题报告
P3168 [CQOI2015]任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组\((S_i,E_i,P_i) ...
- 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]
题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...
- ●洛谷P3168 [CQOI2015]任务查询系统
题链: https://www.luogu.org/problemnew/show/P3168题解: 主席树 强制在线? 那就直接对每一个前缀时间建一个线段树(可持久化线段树),线段树维护优先度权值. ...
- P3168 [CQOI2015]任务查询系统(主席树)
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei ...
- 洛谷P3168 [CQOI2015]任务查询系统
#include<cstdio> #include<cstdlib> #include<algorithm> #include<cstring> #in ...
- Luogu P3168 [CQOI2015]任务查询系统
题目链接 \(Click\) \(Here\) 差分主席树,就是把主席树做成一个差分前缀和的形式,还是很容易想到的. 写主席树的时候几个注意点: 查询可能开始于所有任务之前,二分任务点要把左边界设置为 ...
- p3168 [CQOI2015]任务查询系统(差分+主席树)
恕我才学浅薄,一开始想到的是树状数组+线段树,然后看了题解才第一次见到了差分这种神奇的科技 仔细想想,主席树的本质不就是前缀和嘛,加上一个差分也是可以的,没想到真是罪过罪过 对时间维护一个差分 在Si ...
- 「Luogu P3168 [CQOI2015]任务查询系统」
介绍本题的两种做法: 方法1 前置芝士 线段树:一个很重要的数据结构. 树状数组:一个很重要的数据结构. 具体实现 区间修改,单点查询很容易就会想到树状数组了,至于查询前k个数的和又可以丢给权值线段树 ...
随机推荐
- gometalinter代码质量检查分析工具(golang)
GitHub地址:https://github.com/alecthomas/gometalinter gometalinter安装和使用 1.安装 go get github.com/alectho ...
- 富文本框vue-quill-editor的使用
vue-quill官网:https://www.npmjs.com/package/vue-quill-editor quill官网:https://quilljs.com/docs/quicksta ...
- docker 基础 之安装
一.安装 系统要求 Docker CE 支持 64 位版本 CentOS 7,并且要求内核版本不低于 3.10. CentOS 7 满足最低内核的要求,但由于内核版本比较低,部分功(如 overlay ...
- MySQL 8.0.14 新的密码认证方式和客户端链接
MySQL 8.0.14 新的密码认证方式和客户端链接 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. MySQL8.0在密码认证方式发生了改变,这也是有点小伙伴在MySQL创建 ...
- nGrinder TestRunner DNS / sun.net.spi.nameservice.NameServiceDescriptor
s ngrinder3.3控制台验证脚本报错 http://ngrinder.642.n7.nabble.com/ngrinder3-3-td1301.html 目前发现3.3版本在控制台校验脚本报错 ...
- 【JQ】jq动态绑定事件.on()、解绑事件off()
#JQ 绑定与解绑事件的方法的历史演变 1. jquery1.4 及之前的版本,由.click() 或 .bind()方法绑定的事件,不能适用脚本创建的新元素:即是说页面加载完成后,再动态创建的DOM ...
- layui(四)——table组件常见用法总结
table是 layui 最核心的组成之一.它用于对表格进行一些列功能和动态化数据操作,涵盖了日常业务所涉及的几乎全部需求.支持固定表头.固定行.固定列左/列右,支持拖拽改变列宽度,支持排序,支持多级 ...
- 【leetcode-86】 分隔链表
(1过) 给定一个链表和一个特定值 x,对链表进行分隔,使得所有小于 x 的节点都在大于或等于 x 的节点之前. 你应当保留两个分区中每个节点的初始相对位置. 示例: 输入: head = 1-> ...
- 【1】【leetcode-92】 反转链表 II
(没过,以为简单,结构链表指针搞得很复杂出错.是有捷径的,很典型题目要记住) 反转链表 II(medium) 反转从位置 m 到 n 的链表.请使用一趟扫描完成反转. 说明:1 ≤ m ≤ n ≤ 链 ...
- Git与GitHub学习笔记(六)使用 Github Pages 管理项目文档
前言 你可能比较熟悉如何用 Github Pages 来分享你的工作,又或许你看过一堂教你建立你的第一个 Github Pages 网站的教程.近期 Github Pages 的改进使得从不同的数据源 ...