【bzoj3932】[CQOI2015]任务查询系统 离散化+主席树
题目描述
输入
输出
样例输入
4 3
1 2 6
2 3 3
1 3 2
3 3 4
3 1 3 2
1 1 3 4
2 2 4 3
样例输出
2
8
11
题解
主席树(不需要修改)
先将所有任务读进来,将优先级离散化,再按时间排序加入主席树中。
开始时间加进来,结束时间+1减去。
查询时,相当于查询[1,x]这一段区间,所以不用变为两树相减的形式。
先二分查找出最后一个小于等于x的(即第一个大于x的数-1),然后查询。
注意:需要开long long;sum数组修改时要加减原值,不能是离散化后的值;查询时如果l和r相等,需要返回l的原值乘p
upperbound码错调了半天。。。
#include <cstdio>
#include <algorithm>
#define N 200010
using namespace std;
typedef long long lint;
struct data
{
lint ti , p , mk;
}a[N];
lint v[N] , top , root[N] , lp[N << 6] , rp[N << 6] , si[N << 6] , sum[N << 6] , tot;
lint vti[N];
bool cmp1(data a , data b)
{
return a.p < b.p;
}
bool cmp2(data a , data b)
{
return a.ti < b.ti;
}
void pushup(lint x)
{
si[x] = si[lp[x]] + si[rp[x]];
sum[x] = sum[lp[x]] + sum[rp[x]];
}
void update(lint x , lint &y , lint l , lint r , lint p , lint a)
{
y = ++tot;
if(l == r)
{
si[y] = si[x] + a;
sum[y] = sum[x] + v[p] * a;
return;
}
lint mid = (l + r) >> 1;
if(p <= mid) rp[y] = rp[x] , update(lp[x] , lp[y] , l , mid , p , a);
else lp[y] = lp[x] , update(rp[x] , rp[y] , mid + 1 , r , p , a);
pushup(y);
}
lint query(lint y , lint l , lint r , lint p)
{
if(l == r)
return v[l] * p;
lint mid = (l + r) >> 1;
if(p <= si[lp[y]]) return query(lp[y] , l , mid , p);
else return query(rp[y] , mid + 1 , r , p - si[lp[y]]) + sum[lp[y]];
}
int main()
{
lint n , m , i , x , y , z , pre = 1 , c , k , p;
scanf("%lld%lld" , &n , &m);
for(i = 1 ; i <= n ; i ++ )
{
scanf("%lld%lld%lld" , &x , &y , &z);
a[2 * i - 1].ti = x;
a[2 * i].ti = y + 1;
a[2 * i - 1].p = a[2 * i].p = z;
a[2 * i - 1].mk = 1;
a[2 * i].mk = -1;
}
sort(a + 1 , a + 2 * n + 1 , cmp1);
for(i = 1 ; i <= 2 * n ; i ++ )
{
if(a[i].p != v[top]) v[++top] = a[i].p;
a[i].p = top;
}
sort(a + 1 , a + 2 * n + 1 , cmp2);
for(i = 1 ; i <= 2 * n ; i ++ )
{
vti[i] = a[i].ti;
update(root[i - 1] , root[i] , 1 , top , a[i].p , a[i].mk);
}
while(m -- )
{
scanf("%lld%lld%lld%lld" , &c , &x , &y , &z);
k = 1 + (x * pre + y) % z;
p = upper_bound(vti + 1 , vti + 2 * n + 1 , c) - vti - 1;
if(si[root[p]] < k) pre = sum[root[p]];
else pre = query(root[p] , 1 , top , k);
printf("%lld\n" , pre);
}
return 0;
}
【bzoj3932】[CQOI2015]任务查询系统 离散化+主席树的更多相关文章
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...
- BZOJ_3932_[CQOI2015]任务查询系统_主席树
BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...
- 【BZOJ3932】任务查询系统(主席树)
[BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
随机推荐
- NoSQL入门第四天——事务与主从复制
一.Redis的事务 1.是什么 可以一次执行多个命令,本质是一组命令的集合.一个事务中的 所有命令都会序列化,按顺序地串行化执行而不会被其它命令插入,不许加塞 (更多请参见官网事务介绍) 2.能干什 ...
- See You Again——我最后的汇编程序
汇编语言:课程设计2 前言 由于本人水平不够,这里的课程设计2的程序实现并没有像王爽书中所说的那样可以不依赖于操作系统运行. 这里的程序依然要在dos下运行,而且没有实现引导现有操作系统的功能. 该程 ...
- MySql——查看数据库性能基本参数
使用show status可以查看数据库性能的参数,基本语法:show status like 'value'; 例如: show status like 'Connections';/*连接mysq ...
- Java >>>运算符 和 >> 运算符
>>> 在java 表示有符号右移.什么意思呢?就是最高位符号位也会移动. 我们知道,>>表示有符号右移. -1>> 1 = -1 -1>>2 = ...
- spring源码-事件&监听3.6
一.spring中的发布与监听模式,是我们最常用的一种观察者模式.spring在其中做了很多优化,目的就是让用户更好的使用事件与监听的过程. 二.常用的事件与监听中涉及到的接口和类为:Applicat ...
- Android 模拟器下载、编译及调试
Android 模拟器源码下载 Android 模拟器源码的下载与 Android AOSP 源码库的下载过程类似,可以参考 Google 官方提供的 Android 源码下载文档 来了解这个过程. ...
- Mate20兼容性如何?WeTest带你抢先测!
自从九月份 iPhone XS 系列发布后,WeTest团队迅速入库了iPhone XS和iPhone XR设备,十月份国内巨头华为也重磅推出了一款“Mate 20”设备,让下半年的国内手机市场又热闹 ...
- 「日常训练&知识学习」树的直径(POJ-1849,Two)
题意 一个城市由节点和连接节点的街道组成,街道是双向的. 此刻大雪覆盖了这个城市,市长确定了一些街道要将它们清扫干净,这些街道保证所有的节点可以通过它们连通而且街道数目尽可能小. 现有两台相同的扫雪机 ...
- oracle的数据对象
oracle的数据对象包括表.视图.约束.序列.索引.函数.存储过程.包和触发器等. 这里主要介绍视图.序列.索引.触发器.存储过程 视图是基于一个表或多个表或视图的逻辑表,本身不包含数据,通过它可以 ...
- Qt-QML-Connections,接受组件信号
这里还没有什么新的体会.就直接上代码,在上篇一处上改出来的 import QtQuick 2.5 import QtQuick.Controls 1.4 ApplicationWindow { vis ...