【主席树】BZOJ3932-[CQOI2015]任务查询系统
【题目大意】
超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi。询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少。特别的,如果Ki大于第Xi秒正在运行的任务总数,则直接回答第Xi秒正在运行的任务优先级之和。上述所有参数均为整数,时间的范围在1到n之间(包含1和n)。
【思路】
主席树。在Si秒开始,在Ei秒结束,相当于在Si秒加一,在Ei秒减一的前缀和。
把优先级看作数值,把时间看作T树下标。将优先级离散化后,按照时间排序,记录三元组(time,p,delta),描述时间,优先级及变化量(+1或-1),对于同一个时间,如果当前时间第一次出现,在T[time-1]的基础上更新,否则在T[time]的基础上更新。注意,中间空白的时间段,T[time]=T[time-1]。
【错误点】
query返回条件,但l==r时,不可以直接返回sum,而是sum/size*k。
因为我当前的size可能大于k。
//时刻->下标
//优先级->数值
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
#define lson l,m
#define rson m+1,r
using namespace std;
const int MAXN=+;
typedef long long ll;
struct node
{
int time,p,delta; }a[MAXN*];
bool cmp(node x,node y)
{
return (x.time<y.time);
}
int m,n,tot,d;
int hash[MAXN],T[MAXN],size[MAXN<<],L[MAXN<<],R[MAXN<<];
ll sum[MAXN<<]; int build(int l,int r)
{
int rt=++tot;
sum[rt]=size[rt]=;
if (l<r)
{
int m=(l+r)>>;
L[rt]=build(lson);
R[rt]=build(rson);
}
return rt;
} int update(int pre,int l,int r,int x,int delta)
{
int rt=++tot;
L[rt]=L[pre],R[rt]=R[pre];
sum[rt]=sum[pre]+(ll)delta*hash[x]; // sum 优先级的和:例如两个优先级为3的人物,那么sum=6,而size=2
size[rt]=size[pre]+delta; // size 优先级个数的和:例如两个优先级为3的人物,那么sum=6,而size=2
if (l!=r)
{
int m=(l+r)>>;
if (x<=m) L[rt]=update(L[rt],lson,x,delta);
else R[rt]=update(R[rt],rson,x,delta);
}
return rt;
} ll query(int rt,int l,int r,ll k)
{
int nowsize=size[rt];
if (k>=nowsize) return (sum[rt]);
if (l==r) return (sum[rt]/size[rt]*k);
//当l==r时,当前值可能有多个,且总数大于k,所以只需返回k*当前值即可
int num=size[L[rt]];
ll ret;
int m=(l+r)>>;
if(num>=k)
ret=query(L[rt], lson, k);
else
ret=sum[L[rt]]+query(R[rt],rson, k-num);
return ret;
} void init()
{
tot=;
scanf("%d%d",&m,&n);
for (int i=;i<=m;i++)
{
int s,e,p;
scanf("%d%d%d",&s,&e,&p);
a[*i-]=(node){s,p,};
a[*i]=(node){e+,p,-};
hash[i]=p;
}
sort(hash+,hash+m+);
m=m*;
sort(a+,a+m+,cmp); d=unique(hash+,hash+(m>>)+)-(hash+);
T[]=build(,d);
for (int i=;i<=m;i++)
{
int x=lower_bound(hash+,hash+d+,a[i].p)-hash;
int t=a[i].time;
if (i== || t!=a[i-].time)
{
if (i!=) for (int j=a[i-].time+;j<t;j++) T[j]=T[j-];
T[t]=update(T[t-],,d,x,a[i].delta);
}
else T[t]=update(T[t],,d,x,a[i].delta);
}
} void solve()
{
int pre=;
for (int i=;i<n;i++)
{
ll x,a,b,c;
scanf("%lld%lld%lld%lld",&x,&a,&b,&c);
ll k=+(ll)(a*pre+b)%c;
ll ans=query(T[x],,d,k);
printf("%lld\n",ans);
pre=ans;
}
} int main()
{
//freopen("cqoi15_query.in","r",stdin);
//freopen("cqoi15_query.out","w",stdout);
init();
solve();
return ;
}
【主席树】BZOJ3932-[CQOI2015]任务查询系统的更多相关文章
- 【主席树】 [CQOI2015]任务查询系统
模板题... 差分,然后用主席树维护时间点上的优先值和就好了 就是细节烦... #include<bits/stdc++.h> #define int long long #define ...
- BZOJ3932 CQOI2015 任务查询系统 【主席树】
BZOJ3932 CQOI2015 任务查询系统 Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei, ...
- BZOJ3932: [CQOI2015]任务查询系统 主席树
3932: [CQOI2015]任务查询系统 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 4869 Solved: 1652[Submit][St ...
- 主席树||可持久化线段树||离散化||[CQOI2015]任务查询系统||BZOJ 3932||Luogu P3168
题目: [CQOI2015]任务查询系统 题解: 是一道很经典的题目.大体思路是抓优先级来当下标做主席树,用时刻作为主席树的版本.然而优先级范围到1e7去了,就离散化一遍.然后把每个事件的开始(s). ...
- [bzoj3932][CQOI2015]任务查询系统_主席树
任务查询系统 bzoj-3932 CQOI-2015 题目大意:最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的任务用三元组(Si,Ei,Pi)描述 ...
- [bzoj3932][CQOI2015][任务查询系统] (主席树)
Description 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si ...
- BZOJ3932[CQOI2015]任务查询系统——主席树
题目描述 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第E ...
- [BZOJ3932] [CQOI2015]任务查询系统(主席树 || 树状数组 套 主席树 + 差分 + 离散化)
传送门 看到这个题有个很暴力的想法, 可以每一个时间点都建一颗主席树,主席树上叶子节点 i 表示优先级为 i 的任务有多少个. 当 x 到 y 有个优先级为 k 的任务时,循环 x 到 y 的每个点, ...
- [BZOJ3932][CQOI2015]任务查询系统(差分+主席树)
题面 分析 对于一个区间修改(s,e,v),我们可以将它差分,这样就变成了单点修改s和e+1(s插入,t+1删除) 我们用主席树维护差分数组的前缀和,第i棵主席树维护区间[1,i]之间的所有差分值 那 ...
- BZOJ3932: [CQOI2015]任务查询系统
传送门 真不知道我没学主席树之前是有什么勇气说自己高级数据结构以及学的七七八八了. 这道题应该也是算是主席树的经典运用. 刚开始脑抽了,想把(S,E,P)的处理直接在线用树状数组xjb搞搞算了.写完后 ...
随机推荐
- java对象与json互转
package com.liveyc; import java.io.StringWriter; import org.junit.Test; import com.fasterxml.jackson ...
- 谈一谈我所了解的https
一. http协议 首先我并不会很深入的去探讨这个东西,即使我曾经花了很长的时间去研究这个东西.主要是我考虑到1. 自己没有系统的去学习这一块的知识,讲解的会比较的肤浅.2. 就算是懂这个东西也不一定 ...
- 2017ACM暑期多校联合训练 - Team 8 1011 HDU 6143 Killer Names (容斥+排列组合,dp+整数快速幂)
题目链接 Problem Description Galen Marek, codenamed Starkiller, was a male Human apprentice of the Sith ...
- python碎片记录(三)
1.不换行输出 for i in range(5): print(i,end=' ')不换行打印,end表示每打印一个后面跟的字符 2.利用枚举方式打印输出索引与数值 a=[7,8,9]for ...
- 【IDEA】IDEA中maven项目pom.xml依赖不生效解决
问题: 今天在web项目中需要引入poi相关jar包.查看之下才发现pom.xml中的依赖虽然已经下载到了本地仓库 repository,但是却没有加入到项目路径的 Extenal Libraries ...
- 谁说运维用ELK没用?我就说很有用,只是你之前不会用【转】
1.安装JDK 1)登陆ORACLE官网 (http://www.oracle.com/technetwork/java/javase/downloads/index-jsp-138363.html ...
- 【UOJ#38】【清华集训2014】奇数国
考虑欧拉函数的性质,60很小,压位存下线段树每个节点出现质数. #include<bits/stdc++.h> ; ; typedef long long ll; using namesp ...
- windows 10添加定时任务
1.在搜索栏搜索‘任务计划’ 2.选择任务计划程序,打开 3.创建基本任务 4.输入任务名称 5.选择任务触发周期 6.选择任务触发的具体时间点 7.选择任务需要做的事 8.选择启动程序后,选择具体的 ...
- windows 10开启bash on windows,配置sshd,部署hadoop
1.安装Bash on Windows 这个参考官网步骤,很容易安装,https://msdn.microsoft.com/en-us/commandline/wsl/install_guide 安装 ...
- Python--re模块的findall等用法
1)正则表达式含义 . # 点可代表一切字符 \ # 起转义作用 [...] # 指代方括号中的任意字符 \d # 指代数字0-9 \D # 指代非数字 \s # 指代一切空格,包括tab制表符.空格 ...