坑题。非常坑。
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行,每行一个整数,表示查询结果。
1≤m,n,Si,Ei,Ci≤100000,0≤Ai,Bi≤100000,1≤Pi≤10000000,Xi为1到n的一个排列
懒得改LaTeX了。挺坑的之一是什么1到n排列,,差点被拐跑?没卵用。
然后就是主席树(动态开点线段树吧,感觉算不上主席树??)
然后查询的时候l=r的时候不能直接返回sum。感觉虽然坑但是也挺妙。
然后最坑的是暴力艹翻数据结构。QwQ
#include<bits/stdc++.h> using namespace std; const int N=100010; typedef long long ll; inline int read(){ int r=0,c=getchar(); while(!isdigit(c))c=getchar(); while(isdigit(c)) r=r*10+c-‘0‘,c=getchar(); return r; } int rt[N],ls[N*40],rs[N*40],pre[N*40]; ll sum[N*40],bb[N]; int n,m,cnt,ff; void ins(int &k,int o,int l,int r,int val){ k=++cnt;ls[k]=ls[o],rs[k]=rs[o]; sum[k]=sum[o]+1ll*bb[val]*ff,pre[k]=pre[o]+ff; if(l==r)return; int mid=l+r>>1; if(val<=mid)ins(ls[k],ls[o],l,mid,val); else ins(rs[k],rs[o],mid+1,r,val); } ll query(int k,int l,int r,int rk){ if(rk==0)return 0; if(l==r)return bb[l]*rk; if(rk>=pre[k])return sum[k]; int mid=l+r>>1; if(rk<=pre[ls[k]])return query(ls[k],l,mid,rk); else return sum[ls[k]]+query(rs[k],mid+1,r,rk-pre[ls[k]]); } vector<int>ps[N],pp[N]; void init(){ n=read(),m=read(); for(int i=1;i<=n;i++){ int s=read(),t=read(),v=read();bb[i]=v; ps[s].push_back(v); pp[t+1].push_back(v); } sort(bb+1,bb+n+1); for(int i=1;i<=m;i++){ rt[i]=rt[i-1]; ff=1; for(int j=0;j<ps[i].size();j++){ int x=ps[i][j];x=lower_bound(bb+1,bb+n+1,x)-bb; ins(rt[i],rt[i],1,n,x); } ff=-1; for(int j=0;j<pp[i].size();j++){ int x=pp[i][j];x=lower_bound(bb+1,bb+n+1,x)-bb; ins(rt[i],rt[i],1,n,x); } } } void solve(){ ll ans=1,k,a,b,c; for(int T=1;T<=m;T++){ int pos=read();a=read(),b=read(),c=read(); k=1+(a*ans+b)%c; ans=query(rt[pos],1,n,k); printf("%lld\n",ans); } } int main(){ init(); solve(); }