题目描述

最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少。特别的,如果Ki大于第Xi秒正在运行的任务总数,则直接回答第Xi秒正在运行的任务优先
级之和。上述所有参数均为整数,时间的范围在1到n之间(包含1和n)。

输入

输入文件第一行包含两个空格分开的正整数m和n,分别表示任务总数和时间范围。接下来m行,每行包含三个空格分开的正整数Si、Ei和Pi(Si≤Ei),描述一个任务。接下来n行,每行包含四个空格分开的整数Xi、Ai、Bi和Ci,描述一次查询。查询的参数Ki需要由公式 Ki=1+(Ai*Pre+Bi) mod Ci计算得到。其中Pre表示上一次查询的结果,对于第一次查询,Pre=1。

输出

输出共n行,每行一个整数,表示查询结果。

样例输入

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]任务查询系统 离散化+主席树的更多相关文章

  1. BZOJ3932 CQOI2015 任务查询系统 【主席树】

    BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...

  2. [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)

    传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...

  3. [bzoj3932][CQOI2015]任务查询系统_主席树

    任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...

  4. [bzoj3932][CQOI2015][任务查询系统] (主席树)

    Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...

  5. [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)

    题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...

  6. BZOJ_3932_[CQOI2015]任务查询系统_主席树

    BZOJ_3932_[CQOI2015]任务查询系统_主席树 题意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,P ...

  7. 【BZOJ3932】任务查询系统(主席树)

    [BZOJ3923]任务查询系统(主席树) 题面 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei ...

  8. bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)

    P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...

  9. 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)

    3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...

随机推荐

  1. 网络流Edmonds-Karp算法入门

    今天自习课没事干,看书自学了一下网络流中的EK算法.(求最大流) 设s为源点,t为汇点,C为容量矩阵,F为流量矩阵,f为最大流量. 1.初始化F,f 2.用BFS在残量网络中找到一条从s到t的最短增广 ...

  2. SQL注入的原理与预防

    1. 什么是SQL注入? SQL注入是常见的网络攻击方式之一,通过SQL语句实现无账号登录,非法获取甚至篡改数据库中的数据. 2. SQL注入的思路 (1)找到SQL注入位置: (2)判断服务器类型和 ...

  3. FreeRTOS的信号量和互斥量

    1. 理解如下,言简意赅的说,信号量解决同步,互斥量解决竞争. 信号量用于同步,主要任务间和中断间同步:互斥量用于互锁,用于保护同时只能有一个任务访问的资源,为资源上一把锁. 互斥量具有优先级继承,信 ...

  4. HTML <head>里面的标签

    <head> 中的标签可以引用脚本.指示浏览器在哪里找到样式表.提供元信息等等. 下面这些标签可用在 head 部分:<base>, <link>, <met ...

  5. 七 Appium常用方法介绍

    文本转自:http://www.cnblogs.com/sundalian/p/5629609.html 由于appium是扩展了Webdriver协议,所以可以使用webdriver提供的方法,比如 ...

  6. 分布式部署Apache-Jmeter粗略流程

    注意事项 Windows版和Mac版Jmeter可互相通信 确认被部署的机器安装有JDK并已配置好环境变量 Controller安装 1. 安装Jmeter,监视插件JMeterPlugins-Sta ...

  7. git服务器搭建及eclipse使用git

    一.搭建git服务器 1.yum install git 2.新建用户linux用户git,管理git服务 useradd git passwd git 3.初始化git仓库 git init --b ...

  8. Python输入数据类型判断正确与否的函数大全(非常全)

      对于python输入数据类型判断正确与否的函数大致有三类: (1)type(),它的作用直接可以判断出数据的类型 (2)isinstance(),它可以判断任何一个数据与相应的数据类型是否一致,比 ...

  9. SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false

    根据When an overlay node with actions is copied there is currently a SpriteKit bug where the node’s is ...

  10. 创建一个socket服务实时统计在线人数

    主要是两个文件,一个是后端文件,一个是前端文件: 后端文件:有人登录了,就通知所有的正在访问的页面,把总人数+1:反之-1: 前端文件:有人登录了,通知后端,页面关闭了,通知后端,同时接收后端派发来的 ...