P3168 CQOI2015 任務查詢系統

2022-03-04 03:29:28 字數 2546 閱讀 8431

最近實驗室正在為其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組(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+(ai*pre+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

輸出樣例#1:

2

811

樣例解釋

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的乙個排列

solution:

本題主席樹板子。

題意是個區間修改單點查詢,只不過查詢的時候是要前k小的和。

每個區間$[l,r]+k$,而查詢只要乙個位置$x_i$的情況,想到差分序列,然後搞字首和做到單點修改單點查詢。

我們對等級$p_i$離散,並構建主席樹,由於要求前$k$小的等級和,所以多維護乙個等級和的字首和$sum$。

對於每個詢問,沿著查詢的時刻的權值線段樹自頂向下判斷,模擬求第$k$小數,每次累加返回$sum$就好了。(注意,這樣查詢會出現乙個問題,當乙個等級在同一時刻多次出現時,就會出現遍歷到該等級子節點時$siz>k$,此時不能直接返回$sum$,而應返回$sum/siz*k$)

**:

/*

code by 520 -- 9.13

*/#include

#define il inline

#define ll long long

#define re register

#define for(i,a,b) for(re int (i)=(a);(i)<=(b);(i)++)

#define bor(i,a,b) for(re int (i)=(b);(i)>=(a);(i)--)

using

namespace

std;

const

int n=200005

;int n,m,rt[n],*q[n],w[n],tot,cnt,num;

struct

arr}a[n

<<1

];struct

nodet[n*40

];int

gi()

il bool cmp(const

int *a,const

int *b)

void build(int l,int r,int &rt)

void update(int k,int tag,int l,int r,int lst,int &rt)

ll query(

int rt,int k,int l,int

r)int

main(),a[i+n]=arr;

q[i]=&a[i].val,q[i+n]=&a[i+n].val;

}sort(q+1,q+n*2+1

,cmp);

int lst=-1

; for(i,

1,n<<1

)

if(*q[i]!=lst) lst=*q[i],*q[i]=++cnt,w[cnt]=lst;

else *q[i]=cnt;

sort(a+1,a+n*2+1

); build(

1,cnt,rt[0

]); lst=rt[0

];

for(re int i=1,j=1;i<=m;i++)

ll pre=1

,k,a,b,c;

while(m--)

return0;

}

P3168 CQOI2015 任務查詢系統

最近實驗室正在為其管理的超級計算機編制一套任務管理系統,而你被安排完成其中的查詢部分。超級計算機中的任務用三元組 si,ei,pi 描述,si,ei,pi 表示任務從第si秒開始,在第ei秒後結束 第si秒和ei秒任務也在執行 其優先順序為pi。同一時間可能有多個任務同時執行,它們的優先順序可能相同...

P3168 CQOI2015 任務查詢系統

p3168 cqoi2015 任務查詢系統 傳送門 給你 m 條資訊,即乙個優先順序為 p i 的任務,處理時間為 l i r i 給你 n 條詢問,每條詢問 在 x 時刻優先順序前 k 小的任務 p 的總和為多少。1 n,m 10 5,1 p i 10 7 n,m 這樣的範圍,大概是 o nlog...

P3168 CQOI2015 任務查詢系統

傳送門 求前 k 小的數的和,考慮主席樹 但是如果每個時間都暴力插入顯然會gg 發現每個任務都是區間,查詢是單點查詢 所以考慮維護差分陣列 直接用主席樹維護差分陣列,因為同一時間差分可能有多次修改,所以要把當前修改全部搞完才算當前時間的線段樹 詢問就在相應時間點的線段樹上走 具體看 理解吧 incl...