任务查询系统(cqoi2015,bzoj3932)(主席树)
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的
任务用三元组\((S_i,E_i,P_i)\)描述,\((S_i,E_i,P_i)\)表示任务从第\(S_i\)秒开始,在第\(E_i\)秒后结束(第\(S_i\)秒和\(E_i\)秒任务也在运行
),其优先级为\(P_i\)。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。调度系统会经常向
查询系统询问,第\(X_i\)秒正在运行的任务中,优先级最小的\(K_i\)个任务(即将任务按照优先级从小到大排序后取前\(K_i\)个
)的优先级之和是多少。特别的,如果\(K_i\)大于第\(X_i\)秒正在运行的任务总数,则直接回答第\(X_i\)秒正在运行的任务优先
级之和。上述所有参数均为整数,时间的范围在1到\(n\)之间(包含1和\(n\))。
Input
输入文件第一行包含两个空格分开的正整数\(m\)和\(n\),分别表示任务总数和时间范围。接下来\(m\)行,每行包含三个空格
分开的正整数\(S_i\)、\(E_i\)和\(P_i(S_i≤E_i)\),描述一个任务。接下来\(n\)行,每行包含四个空格分开的整数\(X_i\)、\(A_i\)、\(B_i\)和\(C_i\),
描述一次查询。查询的参数\(K_i\)需要由公式 \(K_i=1+(A_i*Pre+B_i) % C_i\)计算得到。其中\(Pre\)表示上一次查询的结果,
对于第一次查询,\(Pre=1\)。
Output
输出共n行,每行一个整数,表示查询结果。
Sample Input
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
Sample Output
2
8
11
HINT
样例解释
\(K_1 = (1*1+3)%2+1 = 1\)
\(K_2 = (1*2+3)%4+1 = 2\)
\(K_3 = (2*8+4)%3+1 = 3\)
对于100%的数据,\(1≤m,n,S_i,E_i,C_i≤100000\),\(0≤A_i,B_i≤100000\),\(1≤P_i≤10000000\),Xi为1到n的一个排列
题意:
中文题面,不解释
题解:
应该不难想到对于每一个点开一个权值线段树,但空间只有512MB,明显不行,而且如果我们把每个数暴力加入,肯定会TLE,所以需要一堆优化。
我们可以发现每个相隔的线段树,肯定有部分相同,所以我们可以用可持久化线段树来做了,同时对于一个数值,我们在左边那个时间点+1,在右边那个时间点往后一个点-1就可以了。我们开两个vector记录加减就行了。
好吧,还需要离散化。
最后我们对每一个询问求个区间和就行了。
这里有一个坑点,对于第K大那个点,我们需要加的不是这个值而是加上剩下的数乘上当前数。
然后就可以A掉了。
#include<bits/stdc++.h>
#define mid (l+(r-l)/2)
using namespace std;
const int N=100010;
int n,m,q;
vector<int>ad[N],dl[N];
int a[N];
int cnt,root[N],lson[N<<6],rson[N<<6],tr[N<<6];
long long sum[N<<6];
int build(int l,int r){
int rt=++cnt;
if(l==r)return rt;
lson[rt]=build(l,mid);
rson[rt]=build(mid+1,r);
return rt;
}
inline void pushup(int rt){
sum[rt]=sum[lson[rt]]+sum[rson[rt]];
}
int updata(int pre,int l,int r,int x,int z){
int rt=++cnt;
tr[rt]=tr[pre]+z;
if(l==r){
return rt;
}
lson[rt]=lson[pre];
rson[rt]=rson[pre];
if(x<=mid)lson[rt]=updata(lson[pre],l,mid,x,z);
else rson[rt]=updata(rson[pre],mid+1,r,x,z);
return rt;
}
long long query(int rt,int l,int r,int k){
if(l==r)return a[l]*min(k,tr[rt]);
if(tr[lson[rt]]>=k)return query(lson[rt],l,mid,k);
else return query(rson[rt],mid+1,r,k-tr[lson[rt]])+sum[lson[rt]];
}
void dfs(int rt,int l,int r){
if(!tr[rt]||sum[rt])return;
if(l==r){
sum[rt]=tr[rt]*a[l];
return;
}
dfs(lson[rt],l,mid);
dfs(rson[rt],mid+1,r);
pushup(rt);
}
inline int read(){
register int ret=0;register char c;
for(c=getchar();!isdigit(c);c=getchar());
for(;isdigit(c);ret=(ret<<1)+(ret<<3)+c-'0',c=getchar());
return ret;
}
int main(){
cin>>n>>q;
for(int i=1;i<=n;++i){
int l=read(),r=read(),p=read();
ad[l].push_back(p);
dl[r+1].push_back(p);
a[i]=p;
}
sort(a+1,a+n+1);
m=unique(a+1,a+n+1)-a-1;
root[0]=build(1,m);
for(register int i=1;i<=n;++i){
root[i]=root[i-1];
for(vector<int>::iterator it=ad[i].begin();it!=ad[i].end();++it){
root[i]=updata(root[i],1,m,lower_bound(a+1,a+m+1,*it)-a,1);
}
for(vector<int>::iterator it=dl[i].begin();it!=dl[i].end();++it){
root[i]=updata(root[i],1,m,lower_bound(a+1,a+m+1,*it)-a,-1);
}
}
for(int i=0;i<=n;++i){
dfs(root[i],1,m);
}
long long last=1;
while(q--){
int x=read(),aa=read(),bb=read(),cc=read();
aa=((long long)aa*(last%cc)+bb)%cc+1;
last=query(root[x],1,m,aa);
printf("%lld\n",last);
}
}
任务查询系统(cqoi2015,bzoj3932)(主席树)的更多相关文章
- p3168 [CQOI2015]任务查询系统(差分+主席树)
恕我才学浅薄,一开始想到的是树状数组+线段树,然后看了题解才第一次见到了差分这种神奇的科技 仔细想想,主席树的本质不就是前缀和嘛,加上一个差分也是可以的,没想到真是罪过罪过 对时间维护一个差分 在Si ...
- 洛谷$P$3168 任务查询系统 $[CQOI2015]$ 主席树
正解:主席树 解题报告: 传送门! 首先考虑如果是单点修改,那就是个线段树板子嘛$QwQ$ 然后现在是区间修改,对于区间修改,显然就考虑差分下,就变成单点修改辣$QwQ$ 同时单点查询前$k$小也就变 ...
- BZOJ 3932 [CQOI2015]任务查询系统 ——可持久化线段树
[题目分析] 主席树,维护区间大小以及权值之和. 但是细节确实要琢磨很久,WA了几次. [代码] #include <cstdio> #include <cstring> #i ...
- BZOJ3932 主席树
https://www.lydsy.com/JudgeOnline/problem.php?id=3932 题意:给出一些带有等级的线段,求一点上前K小个等级线段的等级之和 询问是对于每一个点询问前K ...
- 【BZOJ3932】[CQOI2015]任务查询系统 主席树
[BZOJ3932][CQOI2015]任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si, ...
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)
P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...
随机推荐
- Laravel 加载自定义的 helpers.php 函数
Laravel 提供了很多 辅助函数,有时候我们也需要创建自己的辅助函数. 必须 把所有的『自定义辅助函数』存放于 bootstrap 文件夹中. 并在 bootstrap/app.php 文件的最顶 ...
- Laravel 5 如何对部份 URI 禁用 CSRF 验证
打开中间件 VerifyCsrfToken.php 在其 $except 属性中添加要禁用的 uri,如: api/user/add api/user/* api/*
- webapp的优化总结
1. 最先加载本地数据,下拉刷新再取最新数据. 2. 图片延后加载.一种方法先<div data-url="xx.png"></div>,先加载一个div, ...
- XE4 for ios 谨慎处理字符串
由于xe4 for ios 里面的字符串处理有变化,具体可以参考官方文档,这两天帮一个朋友调试ios 的 应用,由于没有注意这一块,折腾了很长时间.特此记录下来,希望其他人不要走弯路. 以下面代码为 ...
- 2018.09.08 bzoj1151: [CTSC2007]动物园zoo(状压dp)
传送门 状压dp好题啊. 可以发现这道题的状压只用压缩5位. f[i][j]表示当前在第i个位置状态为j的最优值. 显然可以由f[i-1]更新过来. 因此只用预处理在第i个位置状态为j时有多少个小朋友 ...
- hdu-1209(细节题)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1209 注意:1.时钟到12要变为0 2.注意比较角度相同的情况 #include<iostrea ...
- 38 Cell-phone Emissions can change Brain Activity 手机辐射有可能改变大脑活动
Cell-phone Emissions can change Brain Activity 手机辐射有可能改变大脑活动 So many people use the cell phone so fr ...
- HDU 3247 Resource Archiver (AC自动机+BFS+状压DP)
题意:给定 n 个文本串,m个病毒串,文本串重叠部分可以合并,但合并后不能含有病毒串,问所有文本串合并后最短多长. 析:先把所有的文本串和病毒都插入到AC自动机上,不过标记不一样,可以给病毒标记-1, ...
- 函数作用域和块级作用域--你不知道的JavaScript
et和const在{}内声明都会变为外部不能访问的值,但是const声明的是常量,也不能修改 函数是 JavaScript 中最常见的作用域单元.本质上,声明在一个函数内部的变量或函数会在所处的作用域 ...
- shell中$(( ))、$( )与${ }的区别
转载自:http://blog.sina.com.cn/s/blog_4da051a60102uwda.html 命令替换 在bash中,$( )与` `(反引号)都是用来作命令替换的. 命令替换与变 ...