CQOI 2015 任務查詢系統

2022-05-04 23:36:12 字數 1393 閱讀 3185

[題目鏈結]

[演算法]

首先 , 我們可以將(si , ei , pi)轉化為在si處加入pi , 在(ei + 1)出刪除pi

建立可持久化線段樹 , 維護每秒出現任務的個數和優先順序的和 , 即可

時間複雜度 : o(nlogn)

[**]

#includeusing

namespace

std;

#define maxn 200010typedef

long

long

ll;int

n , m , idx , version;

int s[maxn] , e[maxn] , p[maxn] , root[maxn * 40] , cnt[maxn * 40] , tmp[maxn * 40] , lson[maxn * 40] , rson[maxn * 40] , rt[maxn * 40

];ll sum[maxn * 40

];multiset

< int >ins[maxn] , del[maxn];

template

inline void chkmax(t &x,t y)

template

inline void chkmin(t &x,t y)

template

inline void read(t &x)

inline

void build(int &k , int l , int

r)inline

void modify(int &k , int old , int l , int r , int x , int

value)

inline ll query(

int &k , int l , int r , intx)

intmain()

sort(tmp + 1 , tmp + n + 1

);

int len = unique(tmp + 1 , tmp + n + 1) - tmp - 1

;

for (int i = 1; i <= n; i++)

build(root[version = 0] , 1

, len);

for (int i = 1; i <= n; i++)

for (multiset< int > :: iterator it = del[i].begin(); it != del[i].end(); it++)

rt[i] =version;

}ll pre = 1

;

for (int i = 1; i <= m; i++)

return0;

}

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 個數的和,我們想到主席樹 區間覆蓋問題,我們想到差分 眾所...