bzoj3932【CQOI2015】任务查询系统
2016-03-01 23:02
525 查看
3932: [CQOI2015]任务查询系统
Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 1022 Solved: 368
[Submit][Status][Discuss]
Description
最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分。超级计算机中的任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第Ei秒后结束(第Si秒和Ei秒任务也在运行),其优先级为Pi。同一时间可能有多个任务同时执行,它们的优先级可能相同,也可能不同。调度系统会经常向查询系统询问,第Xi秒正在运行的任务中,优先级最小的Ki个任务(即将任务按照优先级从小到大排序后取前Ki个)的优先级之和是多少。特别的,如果Ki大于第Xi秒正在运行的任务总数,则直接回答第Xi秒正在运行的任务优先级之和。上述所有参数均为整数,时间的范围在1到n之间(包含1和n)。
Input
输入文件第一行包含两个空格分开的正整数m和n,分别表示任务总数和时间范围。接下来m行,每行包含三个空格分开的正整数Si、Ei和Pi(Si≤Ei),描述一个任务。
接下来n行,每行包含四个空格分开的整数Xi、Ai、Bi和Ci,描述一次查询。查询的参数Ki需要由公式 Ki=1+(Ai*Pre+Bi) mod Ci
计算得到。其中Pre表示上一次查询的结果,对于第一次查询,Pre=1。
Output
输出共n行,每行一个整数,表示查询结果。Sample Input
4 31 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
28
11
HINT
样例解释K1 = (1*1+3)%2+1 = 1
K2 = (1*2+3)%4+1 = 2
K3 = (2*8+4)%3+1 = 3
对于100%的数据,1≤m,n,Si,Ei,Ci≤100000,0≤Ai,Bi≤100000,1≤Pi≤10000000,Xi为1到n的一个排列
Source
可持久化线段树裸题然而我改了好久,好久,好久......其实最后也不明白为什么之前是错的......QAQ
80分程序不同的是49行最后为return (ll)l*(ll)num,求好心同学解答。。。T_T
#include<iostream> #include<cstdio> #include<cstdlib> #include<cstring> #include<cmath> #include<algorithm> #define F(i,j,n) for(int i=j;i<=n;i++) #define D(i,j,n) for(int i=j;i>=n;i--) #define ll long long #define maxn 200005 #define maxm 8000005 using namespace std; int m,n,tot; int rt[maxn],ls[maxm],rs[maxm]; int f[maxn],fp[maxn]; ll cnt[maxm],sum[maxm]; struct data{int s,e,p,num;}a[maxn]; struct poi{int tim,val,flg;}b[maxn*2]; inline int read() { int x=0,f=1;char ch=getchar(); while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();} while (ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } inline bool cmpa(data x,data y){return x.p<y.p;} inline bool cmpb(poi x,poi y){return x.tim<y.tim;} inline void build(int &k,int l,int r) { k=++tot;sum[k]=cnt[k]=0; if (l==r) return; int mid=(l+r)>>1; build(ls[k],l,mid); build(rs[k],mid+1,r); } inline void update(int x,int &y,int l,int r,int v,int d) { y=++tot; cnt[y]=cnt[x]+d;sum[y]=sum[x]+(ll)f[v]*(ll)d; if (l==r) return; ls[y]=ls[x];rs[y]=rs[x]; int mid=(l+r)>>1; if (v<=mid) update(ls[x],ls[y],l,mid,v,d); else update(rs[x],rs[y],mid+1,r,v,d); } inline ll query(int k,int num,int l,int r) { if (num==cnt[k]) return sum[k]; if (l==r) return sum[k]/cnt[k]*num; int mid=(l+r)>>1; if (num<=cnt[ls[k]]) return query(ls[k],num,l,mid); else return sum[ls[k]]+query(rs[k],num-cnt[ls[k]],mid+1,r); } int main() { m=read();n=read(); F(i,1,m){a[i].s=read();a[i].e=read();a[i].p=read();a[i].num=i;} sort(a+1,a+m+1,cmpa); int sz=0; F(i,1,m) { if (i==1||a[i].p!=a[i-1].p) f[++sz]=a[i].p; fp[i]=sz; } F(i,1,m) { b[i*2-1]=(poi){a[i].s,fp[i],1}; b[i*2]=(poi){a[i].e+1,fp[i],-1}; } sort(b+1,b+m*2+1,cmpb); build(rt[0],1,n); int t=1; F(i,1,n) { int pre=rt[i-1],tmp=rt[i-1]; for(;t<=2*m&&b[t].tim==i;t++) { update(pre,tmp,1,n,b[t].val,b[t].flg); pre=tmp; } rt[i]=tmp; } ll pr=1; F(i,1,n) { ll xi=read(),ai=read(),bi=read(),ci=read(); ll ki=(ai*pr+bi)%ci+1; if (ki>cnt[rt[xi]]) pr=sum[rt[xi]]; else if (ki==0) pr=0; else pr=query(rt[xi],ki,1,n); printf("%lld\n",pr); } return 0; }
相关文章推荐
- ssh 连接 mac osx下 virtual box虚拟机中的 cent os 记录
- Html 学习笔记1
- html的积累
- 自定义比较优先级的set:TreeSet(有序(按照某种规则排序),唯一)
- 重新实现关于Mikolov的集成文本分类实验(详细过程)-
- 正则表达式
- SqlCommand执行带GO的SQL脚本文件
- new/delete和malloc/free的区别
- mips体系结构--汇编
- 学习linux决心书
- 8VC Venture Cup 2016 - Final Round (Div. 2 Edition) D. Factory Repairs 树状数组
- String类的输入和输出及基本操作
- NSdata 与 NSString,Byte数组,UIImage 的相互转换
- ubuntu编译安装sqlite库
- 学习linux决心书
- UVA 10285
- C++ 字符串防止溢出:strncpy,snprintf,strnlen,memset的使用
- 二叉树的递归遍历(dp)
- [Java] 实验1
- scanf()函数用法小结