CQOI2015 任務查詢系統

2022-09-19 02:45:07 字數 853 閱讀 8834

離散化優先順序,假如我們為每一秒建一棵線段樹,儲存各個優先順序的資訊,就可以直接查詢了,但是時空都會**。所以問題在於如何建立秒與秒之間的關係,以減少時空開銷。

1:假如沒有任何任務,那麼第 i 秒的情況與第一秒相同。到一般情況,對於任何一段沒有新任務的時間段,這些時間所涵蓋的資訊是相同的。也就是說之後的資訊是建立在之前資訊之上的,第 i 秒的資訊是建立在第 i-1 秒之上的。

2:考慮乙個任務(si,ei,pi),這乙個任務帶來的影響在時間段 [ si , ei ] 內是相同的,我們就想到差分了,只需要在第 si 秒將貢獻加上,在第 ei + 1 秒將貢獻移除就可以了。

3:實現採用主席樹。

需要注意的是對於同一秒有多個任務開始或結束的情況,這其實牽扯到自己對主席樹的理解以及寫法,我也不會表達,我採用了乙個迭代實現。

// q.c

#include#include#include#include#include#includeusing namespace std;

typedef long long ll;

const int m=100000+10;

struct node

};int f[m];

struct segmenttree

void update(int o)

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

} void insert(int &o,int po,int x,int k)

} ll query(int o,int k)

}t;struct ques ; vectorqs[m];

struct data

return 0;

}

CQOI2015 任務查詢系統

因為對於任務來說,對一段區間是有用的,於是我們可以用差分來表示區間,然後主席樹維護字首區間和即可。然後因為我們是求和,我們同時主席樹也要維護區間的數字個數,因為求k小和。但是有可能當前區間的有a個相同的數字,我們求b個和,然後bac pragma gcc optimize 2 include def...

CQOI2015 任務查詢系統

主席樹維護k大,考慮到利用主席樹字首和的性質。把每個任務拆分成權值為1的進入操作,和權值為 1的退出操作 注意因為是閉區間,所以右邊的位置加進去的時候需要 1 應該是個動態開點的權值線段樹一樣的東西吧 維護v,表示該節點維護的任務數量是多少。sum表示該節點維護的任務總和是多少。輸出k大的時候 因為...

CQOI 2015 任務查詢系統

給定 m 個任務 l,r,p 其中 l,r 代表這個任務將於時間 l,r 內進行,而 p 代表的是這個任務的優先順序 有 n 個詢問 x,k 每次詢問在時間點 x 進行的所有任務按優先順序從小到大排序,前 k 個任務的優先順序之和 求前 k 個數的和,我們想到主席樹 區間覆蓋問題,我們想到差分 眾所...