1. 程式人生 > >[bzoj3932][CQOI2015]任務查詢系統

[bzoj3932][CQOI2015]任務查詢系統

i++ tor main while () 數據結構 san init 任務管理

坑題。非常坑。


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(); }

[bzoj3932][CQOI2015]任務查詢系統