P3168 CQOI2015 任務查詢系統

2022-03-01 16:17:48 字數 2252 閱讀 6760

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

題解

需要用差分陣列

總而言之就是令$b[i]=a[i]-a[i-1]$

於是$\sum_^n b[i]=a[i]$

可以通過字首和來查詢單個位置的值

每乙個任務,就是給區間$[l,r]$每乙個位置加上優先順序$k$

等價於$b[l]+=k,b[r+1]-=k$

然後可以對每乙個位置存下每個修改,然後在每個位置建主席樹

記錄下每個位置最後修改後所建主席樹的編號,查詢時直接使用

1

//minamoto

2 #include3

#define ll long long

4using

namespace

std;

5#define getc() (p1==p2&&(p2=(p1=buf)+fread(buf,1,1<<21,stdin),p1==p2)?eof:*p1++)

6char buf[1

<<21],*p1=buf,*p2=buf;

7 templateinline bool cmax(t&a,const t&b)

8 inline int

read()

18char obuf[1

<<24],*o=obuf;

19void

print(ll x)

23const

int n=2e5+5,m=5e6+5;24

int l[m],r[m],num[m],rt[n],spj[n<<1

];ll sum[m];

25/*

根據題意 1 <= pi <= 10000000

26按照權值線段樹的定義空間顯然是不夠的

27但考慮一共只有2m次插入,每次只增加log2m個節點

28所以我們這麼開是沒有問題的

*/29

int ver[n<<1],next[n<<1

],head[n];

30int n,q,cnt=0,tot=0,fx,m;ll ans=1;31

void add(int u,int

e)34

void update(int last,int &now,int l,int r,int

x)43 ll query(int u,int l,int r,int

k)49

intmain()

56for(int u=1;u<=n;++u)

61while(q--)

69 fwrite(obuf,o-obuf,1

,stdout);

70return0;

71 }

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...