NOI2010 超級鋼琴

2021-10-04 08:21:41 字數 845 閱讀 8407

和有一道區間前k大異或很像。

先求字首和,然後就變成右端點固定,取左端點的第k小問題,主席樹維護即可。

並用堆維護前k個。

ac**:

#pragma gcc optimize("-ofast","-funroll-all-loops")

#include

//#define int long long

using namespace std;

const

int n=

5e5+

10,m=n*40;

int n,up=

5e8,k,l,r,a[n]

,num;

long

long res;

int rt[n]

,lc[m]

,rc[m]

,sum[m]

,cnt;

struct node

;bool operator <

(node a,node b)

priority_queue q;

void

change

(int l,

int r,

int&x,

int y,

int k)

intkth

(int l,

int r,

int x,

int y,

int k)

signed

main()

);}while

(q.size()

&&k--))

;}cout

}

NOI2010 超級鋼琴

傳送門 這個題有趣。巧妙地利用st表和堆 首先最暴力的我就不說了 第二個暴力就是主席樹 堆,預計得分70 80,時間o klog 2n std是用堆儲存可能的區間,然後用st表查詢區間最小值 因為其實如果知道區間右端點,再處理個字首和s 那麼就只要查詢區間最小值就可以了,可以st表o 1 做 inc...

NOI2010 超級鋼琴

求出字首和 對於每個結尾i,設現在取的區間是 j 1,i 則i r j i l,取出該區間sum j 的最小值,將sum i sum j 放入堆中 建立乙個大根堆,每次取出堆頂元素,將排名k 1,將sum i 區間第k小值放入堆中 求區間第k小可以用主席樹 直到取滿k次為止 include incl...

NOI2010 超級鋼琴

題面 給定乙個序列 a 1 n 定義區間 l,r 的權值為 l r l 1 r lra i l le r l 1 le r sum l ra i l r l 1 r lr a i 現在求權值前k大的區間和它們權值的和 題解首先對於每個左端點 x 他的右端點所在區間為 x l 1,x r 1 而每個區...