NOI2010 超級鋼琴

2021-08-13 11:55:39 字數 804 閱讀 4537

傳送門

這個題有趣。。。

巧妙地利用st表和堆

首先最暴力的我就不說了

第二個暴力就是主席樹+堆,預計得分70~80,時間o(

klog

2n)

std是用堆儲存可能的區間,然後用st表查詢區間最小值

因為其實如果知道區間右端點,再處理個字首和s

那麼就只要查詢區間最小值就可以了,可以st表o(1)做

**:

#include

#include

#include

#include

#include

#define mp(a,b,c,d) make_pair(make_pair(a,b),make_pair(c,d))

#define min(a,b) s[a]>s[b]?b:a

using

namespace

std;

inline

int read()

typedef pair pii;

const

int n=5e5+5;

int n,k,l,r;

int a[n],mn[19][n],log[n],s[n];

long

long ans=0;

priority_queue> q;

inline

int query(int l,int r)

int main()

printf("%lld",ans);

return

0;}

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 超級鋼琴

和有一道區間前k大異或很像。先求字首和,然後就變成右端點固定,取左端點的第k小問題,主席樹維護即可。並用堆維護前k個。ac pragma gcc optimize ofast funroll all loops include define int long long using namespace...

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 而每個區...