【主席树】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搞搞算了.写完后 ...
随机推荐
- NYOJ 305 表达式求值 (字符串处理)
题目链接 描述 Dr.Kong设计的机器人卡多掌握了加减法运算以后,最近又学会了一些简单的函数求值,比如,它知道函数min(20,23)的值是20 ,add(10,98) 的值是108等等.经过训练, ...
- kendo method:destroy 解决有些在kendo.all.js 的js 库里报错问题
首先,不得不承认,kendo UI 是个不错的东西,特别对于一个前端开发到行不足的程序猿来说.而在我们使用过程中貌似还是会遇到各种奇怪的问题.比如我们会经常用到对一些控件进行重赋值. destroy ...
- Coursera在线学习---第二节.Octave学习
1)两个矩阵相乘 A*B 2)两个矩阵元素位相乘(A.B矩阵中对应位置的元素相乘) A.*B 3)矩阵A的元素进行平方 A.^2 4)向量或矩阵中的元素求倒数 1./V 或 1./A 5) ...
- 笔记本自开wifi设置
笔记本自开wifi设置 是这样的有些笔记本他自身就可以放出热点供其他的小伙伴们连接,不用非得去下专门的工具有些笔记本的网卡是自带支持双收发的(这里注意我指的是有些笔记本不是全部) 命令我已经写出来了 ...
- utsrelease.h 包含svn信息
utsrelease.h是一个自动生成的文件,没有办法修改,但这个数据是根据Makefile和.config的内容进行生成的,通过修改这两个文件的内容,可以改变!/usr/src/linux/Make ...
- 在shell中如何判断字符串是否为有效的IP地址【转】
转自 在shell中如何判断字符串是否为有效的IP地址_echoisecho_新浪博客http://blog.sina.com.cn/s/blog_53a844e50100xxus.html 近来需要 ...
- 使用xbee连接地面站和飞控
Zigbee是一种短距离.低功耗的近距离无线组网通讯技术,主要适用于自动控制和远程控制领域,可以嵌入各种设备. DIGI的ZigBee产品XBee小型但却是一个功能完善的ZigBee收发器(即接收器/ ...
- Linux阵列 RAID详解 (转)
原文链接:http://molinux.blog.51cto.com/2536040/516008 一. RAID详解 二. mdadm工具介绍 三. 创建一个RAID的基本过程 四. ...
- Django实现文章按年月归档、点赞和评论、发送邮件
文章归档的实现 我们在创建文章时,会在数据库中存储文章创建的时间这样的字段,一般用的都是datetime类型,记录文章创建的年月日和时分秒,所以我们直接使用文章的创建时间分类是无法实现文章的按年月归档 ...
- hdu 1907(Nim博弈)
John Time Limit: 5000/1000 MS (Java/Others) Memory Limit: 65535/32768 K (Java/Others)Total Submis ...