博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
[CQOI2015]任务查询系统(差分+主席树)
阅读量:4135 次
发布时间:2019-05-25

本文共 2488 字,大约阅读时间需要 8 分钟。

链接:https://ac.nowcoder.com/acm/problem/19936

来源:牛客网

题目描述

最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(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+(AiPre+Bi) mod Ci计算得到。其中Pre表示上一次查询的结果,对于第一次查询,Pre=1。
输出描述:
输出共n行,每行一个整数,表示查询结果。
示例1
输入
复制
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
沙雕题,到最后我也不知道为什么我的是mle。。
离散化优先级之后,对于每件物品,我们在它开始的时间+1
优先级,在它结束的时间后一秒-1*优先级。然后再类似于差分数组遍历一遍求每一个时间点的优先级和。剩下的就是主席树求前k小的优先级和的模板了。
代码如下:

#include 
using namespace std;typedef long long ll;const int maxn = 1e6+9; int num;int dl[maxn],dr[maxn],p[maxn],h[maxn],who[maxn];ll sum[maxn*40],cnt[maxn*40];int rt[maxn*40],lson[maxn*40],rson[maxn*40];int cur; void build(int &now,int l,int r,int L,int val){
if(!now)now=++cur;//在这里最好用引用,因为如果之前这个节点扩展过,就不用再重复开辟了 sum[now]+=1ll*val*h[L]; cnt[now]+=val; if(l==r)return; int mid=(l+r)>>1; if(L<=mid)build(lson[now],l,mid,L,val); else build(rson[now],mid+1,r,L,val);} int rebuild(int x,int y){
if(!x||!y)return x+y; int now=++cur; sum[now]=sum[x]+sum[y]; cnt[now]=cnt[x]+cnt[y]; lson[now]=rebuild(lson[x],lson[y]); rson[now]=rebuild(rson[x],rson[y]); return now;} ll query(int now,int l,int r,ll k){
if(l==r){
return 1ll*h[l]*min(k,cnt[now]); } int mid=(l+r)>>1; if(cnt[lson[now]]>=k)return query(lson[now],l,mid,k); else return sum[lson[now]]+query(rson[now],mid+1,r,k-cnt[lson[now]]);} int main(){
int n,m; scanf("%d%d",&n,&m); for(int i=1;i<=n;i++){
scanf("%d%d%d",&dl[i],&dr[i],&p[i]); h[i]=p[i]; } sort(h+1,h+1+n); num=unique(h+1,h+1+n)-h-1; for(int i=1;i<=n;i++){
who[i]=lower_bound(h+1,h+1+num,p[i])-h; } for(int i=1;i<=n;i++){
build(rt[dl[i]],1,num,who[i],1); build(rt[dr[i]+1],1,num,who[i],-1); } for(int i=1;i<=m;i++){
rt[i]=rebuild(rt[i-1],rt[i]);//类似于差分数组,遍历一遍 } int x,a,b,c; ll ans=1; for(int i=1;i<=m;i++){
scanf("%d%d%d%d",&x,&a,&b,&c); ll k=1+1ll*(1ll*a*ans%c+b)%c; ans=query(rt[x],1,num,k); printf("%lld\n",ans); } return 0;}

努力加油a啊,(o)/~

转载地址:http://mutvi.baihongyu.com/

你可能感兴趣的文章
在有序的数列中查找某数,若该数在此数列中,则输出它所在的位置,否则输出no found
查看>>
万年历
查看>>
作为码农你希望面试官当场指出你错误么?有面试官这样遭到投诉!
查看>>
好多程序员都认为写ppt是很虚的技能,可事实真的是这样么?
查看>>
如果按照代码行数发薪水会怎样?码农:我能刷到公司破产!
查看>>
程序员失误造成服务停用3小时,只得到半月辞退补偿,发帖喊冤
查看>>
码农:很多人称我“技术”,感觉这是不尊重!纠正无果后果断辞职
查看>>
php程序员看过来,这老外是在吐糟你吗?看看你中了几点!
查看>>
为什么说程序员是“培训班出来的”就是鄙视呢?
查看>>
码农吐糟同事:写代码低调点不行么?空格回车键与你有仇吗?
查看>>
阿里p8程序员四年提交6000次代码的确有功,但一次错误让人唏嘘!
查看>>
一道技术问题引起的遐想,最后得出结论技术的本质是多么的朴实!
查看>>
985硕士:非科班自学编程感觉还不如培训班出来的,硕士白读了?
查看>>
你准备写代码到多少岁?程序员们是这么回答的!
查看>>
码农:和产品对一天需求,产品经理的需求是对完了,可我代码呢?
查看>>
程序员过年回家该怎么给亲戚朋友解释自己的职业?
查看>>
技术架构师的日常工作是什么?网友:搭框架,写公共方法?
查看>>
第四章 微信飞机大战
查看>>
九度:题目1008:最短路径问题
查看>>
九度Online Judge
查看>>