bzoj 3932: [CQOI2015]任务查询系统
Description
Input
Output
Sample Input
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
8
11
HINT
Source
唉,一道主席树板子题竟然WA得怀疑人生。。。
首先任务是[s,t]这一段出现,我们可以选择区间加法也可以选择直接差分,显然差分好打得多。。。
也就是说把询问拆成两个,一个是在s加,另一个是在t+1减。。。把这些事件按时间排序。。。
我们对于每一个时间点建立一颗权值线段树,然后先复制前一个时间点的历史版本。。。
然后一个一个的把该时间点的事件加入,该点的权值线段树中,此时以自己为历史版本。。。
然后query的就是一个很正常的一个权值线段树上的区间求和,然而这样会获得80分。。。
query 的递归边界(l==r)时,一个权值上可能有多个任务,就是说可能大于query传上来的K。。
所以我们要return sum[x]/size[x]*K。。。
哦,忘了说要离散化一下。。。
// MADE BY QT666
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<iostream>
#include<cstring>
#define int long long
using namespace std;
typedef long long ll;
const int N=100050;
int root[N*2],ls[N*40],rs[N*40],sum[N*40],size[N*40],sz;
int hsh[N],tot,m,n,cnt;
struct data{
int t,val,type;
}q[N*2];
bool cmp(const data &a,const data &b){
return a.t<b.t;
}
void insert(int &y,int x,int l,int r,int v,int type){
y=++sz;size[y]=size[x]+type;
ls[y]=ls[x];rs[y]=rs[x];
sum[y]=sum[x]+hsh[v]*type;
if(l==r) return;
int mid=(l+r)>>1;
if(v<=mid) insert(ls[y],ls[x],l,mid,v,type);
else insert(rs[y],rs[x],mid+1,r,v,type);
}
int query(int x,int l,int r,int K){
if(l==r){
if(size[x]) return sum[x]/size[x]*K;
else return 0;
}
int mid=(l+r)>>1;
if(size[ls[x]]>=K) return query(ls[x],l,mid,K);
else return sum[ls[x]]+query(rs[x],mid+1,r,K-size[ls[x]]);
}
main(){
scanf("%lld%lld",&m,&n);
for(int i=1;i<=m;i++){
int st,ed,p;scanf("%lld%lld%lld",&st,&ed,&p);
q[++cnt]=(data){st,p,1};q[++cnt]=(data){ed+1,p,-1};
hsh[++tot]=p;
}
sort(hsh+1,hsh+1+tot);tot=unique(hsh+1,hsh+tot+1)-hsh-1;
sort(q+1,q+1+cnt,cmp);
for(int i=1;i<=cnt;i++) q[i].val=lower_bound(hsh+1,hsh+1+tot,q[i].val)-hsh;
int j=1;
for(int i=1;i<=n;i++){
root[i]=root[i-1];
while(q[j].t<=i&&j<=cnt) insert(root[i],root[i],1,m,q[j].val,q[j].type),j++;
}
int pre=1;
for(int i=1;i<=n;i++){
int x,a,b,c;scanf("%lld%lld%lld%lld",&x,&a,&b,&c);
int k=1+(a*pre+b)%c;
k=min(k,size[root[x]]);pre=query(root[x],1,m,k);
printf("%lld\n",pre);
}
return 0;
}
bzoj 3932: [CQOI2015]任务查询系统的更多相关文章
- 2018.06.30 BZOJ 3932: [CQOI2015]任务查询系统(主席树)
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管理 ...
- bzoj 3932: [CQOI2015]任务查询系统 -- 主席树 / 暴力
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MB Description 最近实验室正在为其管理的超级计算机编制一套任务管 ...
- bzoj 3932 [CQOI2015]任务查询系统(主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分. 超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- BZOJ 3932: [CQOI2015]任务查询系统 [主席树]
传送门 题意: 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi 调度系统会经常向查询系统询问,第Xi ...
- BZOJ 3932 [CQOI2015]任务查询系统 ——可持久化线段树
[题目分析] 主席树,维护区间大小以及权值之和. 但是细节确实要琢磨很久,WA了几次. [代码] #include <cstdio> #include <cstring> #i ...
- BZOJ 3932 [CQOI2015]任务查询系统 - 差分 + 主席树
Solution 差分就好了, 在$s_i$ 的点+1, $e_i + 1$ 的点 - 1. 查询的时候注意$l == r$ 要返回 $k * b[l]$ ,而不是$sum[node] $因为当前位置 ...
- BZOJ.3932.[CQOI2015]任务查询系统(主席树 差分)
题目链接 对于这一区间的操作,我们可以想到差分+前缀和(感觉也没什么别的了..). 同时对于本题我们能想到主席树,而主席树正是利用前一个节点建树的. 所以离散化.按时间排序,把操作拆成单点加和减即可. ...
- BZOJ 3932: [CQOI2015]任务查询系统 | 主席树练习题
题目: 洛谷也能评测 题解: De了好长时间BUG发现是自己sort前面有一行for没删,气死. 题目询问第x秒时候前k小的P值之和. 朴素想法: 我们可以把P值离散化,然后对于每个时刻建一棵定义域是 ...
- BZOJ 3932: [CQOI2015]任务查询系统 (主席树板题)
就是裸的主席树,差分之后排序插入主席树就行了. 注意主席树查询的时候叶子节点要特判,因为本身是有size的 还有要开longlong CODE #include <cctype> #inc ...
随机推荐
- Gluon炼丹(Kaggle 120种狗分类,迁移学习加双模型融合)
这是在kaggle上的一个练习比赛,使用的是ImageNet数据集的子集. 注意,mxnet版本要高于0.12.1b2017112. 下载数据集. train.zip test.zip labels ...
- KVM克隆 快照
原创博文安装配置KVM http://www.cnblogs.com/elvi/p/7718574.htmlweb管理kvm http://www.cnblogs.com/elvi/p/7718582 ...
- Linux常用命令及部分详解
1.总结部分 常用指令 ls 显示文件或目录 -l 列出文件详细信息l(list) -a 列出当前目录下所有文件及目录,包括隐藏的a(all) m ...
- 智能合约语言Solidity教程系列2 - 地址类型介绍
智能合约语言Solidity教程系列第二篇 - Solidity地址类型介绍. 写在前面 Solidity是以太坊智能合约编程语言,阅读本文前,你应该对以太坊.智能合约有所了解,如果你还不了解,建议你 ...
- Cs Round#54 D Spanning Trees
题意:构造一张N个结点无重边.无自环的无向图.使得其最小生成树和最大生成树共享K条边. 样例一很具有启发性: 当K!=0时,我们可以先构造出一条链,链的长度为n-k的链,作为最小生成树的一部分,之后由 ...
- 从Windows迁移SQL Server到Linux
前一篇博客关于SQL Server on Linux的安装,地址:http://www.cnblogs.com/fishparadise/p/8057650.html,现在测试把Windows平台下的 ...
- 使用hiredis实现pipeline方式访问
1.介绍 hiredis: 一个c/c++的访问redis的api库 地址:https://github.com/redis/hiredis pipeline方式: redis中的pipeline方式 ...
- Tomcat (安装及web实现 基础)
Tomcat服务器配置 安装:解压对应的版本就行 注意;不要把Tomcat放到有中文的和有空格的目录中 验证是否安装成功:进入安装盘的安装文件的bin目录下 执行startup bat 成功 80 ...
- MyBatis多租户隔离插件开发
在SASS的大潮流下,相信依然存在很多使用一个数据库为多个租户提供服务的场景,这个情况下一般是多个租户共用同一套表通过sql语句级别来隔离不同租户的资源,比如设置一个租户标识字段,每次查询的时候在后面 ...
- handler 源代码分析
handler Looper 轮询器 MessageQueue 消息对象 1 主线程在一创建的时候就会调用, public static void prepareMainLooper() {}构造方法 ...