【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)
题目链接
被自己的sb错误调到自闭。。
主席树的进阶应用。
把\(P_i\)离散化一下,得到每个\(P_i\)的排名,然后建一棵维护\(m\)个位置的主席树,每个结点记录区间总和和正在进行的任务数。
差分一下,主席树维护前缀和,每个时刻一个\(root\)。
然后就是线段树里查前\(k\)小了。
#include <cstdio>
#include <algorithm>
using namespace std;
const int MAXN = 4000010;
struct PT{
int lc, rc, cnt;
long long val;
}t[MAXN << 2];
int rk[MAXN];
struct lsh{
int val, id;
int operator < (const lsh A) const{
return val < A.val;
}
}p[MAXN];
int n, m;
struct Edge{
int next, to, dis;
}e[MAXN];
int head[MAXN], num;
long long pre = 1;
inline void Add(int from, int to, int dis){
e[++num].to = to; e[num].next = head[from]; e[num].dis = dis; head[from] = num;
}
inline int read(){
int s = 0, w = 1;
char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
return s * w;
}
int a[MAXN], b[MAXN], c[MAXN], root[MAXN], cnt, r, A, B, C, X, K;
inline void pushup(int x){
t[x].val = t[t[x].lc].val + t[t[x].rc].val;
t[x].cnt = t[t[x].lc].cnt + t[t[x].rc].cnt;
}
int build(int l, int r){
if(l == r) return ++cnt;
int id = ++cnt, mid = (l + r) >> 1;
t[id].lc = build(l, mid);
t[id].rc = build(mid + 1, r);
return id;
}
int update(int q, int l, int r, int x, int y){
if(l == r){ t[++cnt].val = t[q].val + y; t[cnt].cnt = t[q].cnt + (y > 0 ? 1 : -1); return cnt; }
int id = ++cnt, mid = (l + r) >> 1;
t[id] = t[q];
if(x <= mid) t[id].lc = update(t[q].lc, l, mid, x, y);
else t[id].rc = update(t[q].rc, mid + 1, r, x, y);
pushup(id);
return id;
}
long long query(int q, int l, int r, int x){
if(l == r) return t[q].val;
int mid = (l + r) >> 1;
if(t[t[q].lc].cnt >= x) return query(t[q].lc, l, mid, x);
else return t[t[q].lc].val + query(t[q].rc, mid + 1, r, x - t[t[q].lc].cnt);
}
int main(){
m = read(); n = read();
for(int i = 1; i <= m; ++i){
a[i] = read(); r = max(r, b[i] = read());
p[i].id = i; p[i].val = c[i] = read();;
}
sort(p + 1, p + m + 1);
for(int i = 1; i <= m; ++i)
rk[p[i].id] = i;
for(int i = 1; i <= m; ++i){
Add( a[i] , rk[i], c[i]);
Add(b[i] + 1, rk[i], -c[i]);
}
root[0] = build(1, m);
for(int i = 1; i <= n; ++i){
int tmp = root[i - 1];
for(int j = head[i]; j; j = e[j].next)
tmp = update(tmp, 1, m, e[j].to, e[j].dis);
root[i] = tmp;
}
for(int i = 1; i <= n; ++i){
X = read(); A = read(); B = read(); C = read();
K = ((long long)A * pre + B) % C + 1;
printf("%lld\n", pre = query(root[X], 1, m, K));
}
return 0;
}
【洛谷 P3168】 [CQOI2015]任务查询系统(主席树)的更多相关文章
- 洛谷P3168 [CQOI2015]任务查询系统 [主席树,差分]
题目传送门 任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任 ...
- 洛谷 P3168 [CQOI2015]任务查询系统 解题报告
P3168 [CQOI2015]任务查询系统 题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组\((S_i,E_i,P_i) ...
- ●洛谷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 ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- [CQOI2015]任务查询系统 主席树
[CQOI2015]任务查询系统 LG传送门 以前还没见过主席树的这种写法. 考虑使用差分的思想处理每一个任务,然后所有的东西就都能顺理成章地用主席树维护了,查询的时候和平时的主席树有一点不同,详见代 ...
- 【BZOJ3932】[CQOI2015]任务查询系统 主席树
[BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...
- bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...
- BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题
题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...
随机推荐
- 如何在一台 web 服务器上注册CA证书
试验环境介绍(CA的主机为192.168.23.10.httpd的主机为:192.168.23.11) 1:新建一台web服务器,主机名为www yum install -y httpd 2:生成 ...
- error CS0234: 命名空间“System.Drawing”中不存在类型或命名空间名称“Image”(是否缺少程序集引用?)
- sublime py不能输入中文
设置环境变量PYTHONIOENCODING=UTF-8,重启sublime即可 转载请注明博客出处:http://www.cnblogs.com/cjh-notes/
- HDU4675_GCD of Sequence
很有意思的一个数论题. 是这样的,给你一个数数组a[i],其中给出的每一个数字和要求的数字方位都是[1,m],现在问你根据a[]构造一个b[],且a和b中间的不相等的元素的个数恰好有k个. 现在问你g ...
- stm32中使用#pragma pack(非常有用的字节对齐用法说明)
#pragma pack(4) //按4字节对齐,但实际上由于结构体中单个成员的最大占用字节数为2字节,因此实际还是按2字节对齐 typedef struct { char buf[3];//bu ...
- shell脚本学习—正则表达式
正则表达式概念.特点 正则表达式是对字符串操作的一种逻辑公式,就是用事先定义好的一些特定字符.及这些特定字符的组合,组成一个“规则字符串”, 这个“规则字符串”用来表达对字符串的一种过滤辑. 给定一个 ...
- QoS专题-第4期-QoS实现之限速
QoS实现之限速 通过前面几篇介绍,大家都知道了MQC是实现QoS的技术,优先级映射是实现QoS的前提条件.读完之后也许无法直观感觉到QoS是如何提升网络服务质量.今天小编给大家介绍限速,通过实验,可 ...
- 数百种编程语言,而我为什么要学 Python?
是应用率最高.长期霸占排行榜的常青藤 Java?是易于上手,难以精通的 C?还是在游戏和工具领域仍占主流地位的 C++?亦或是占据 Windows 桌面应用程序半壁江山的 C#?…… 我想,每个人可能 ...
- 浴谷金秋线上集训营 T11738 伪神(树链剖分)
先树链剖分,一棵子树的编号在数组上连续,一条链用树链剖分,把这些线段全部取出来,做差分,找到有多少点被>=t条线段覆盖即可. #include<iostream> #include& ...
- [持续更新][备份]GDB调试工具常用命令
一.前言 ACM开赛在即,得知dev-cpp不适用之后,不得不再次重拾gdb基本操作... 辗转Emacs和Code::blocks数次之后,感觉还是Emacs更适合我的风格,尽管配置稍显麻烦,但其开 ...