超級鋼琴(主席樹 貪心 優先佇列)

2021-09-27 06:10:19 字數 1203 閱讀 6097

我能說這是主席樹板子題嘛?

題意:給定乙個序列,求長度在l

ll與r

rr內的前k

kk大子串和。

思路

既然有子串,肯定要先搞個字首和,離散化之類的

然後我們建好主席樹

而主要的思路在於貪心,我們可以列舉子串的左端點,然後在其合法的右端點中通過主席樹找到最大的右端點(子串滿足字首和關係,每個右端點都會減去這個相同的左端點的前乙個值)

把列舉得到的所有最大子串都放進優先佇列中(維護左端點+最大子串),每次取出隊頭,就在答案中加上這個值,然後再以當前左端點利用主席樹求區間第j+1

j+1j+

1大(假設剛剛取出的是第j

jj大),又塞進優先佇列即可

這樣時間複雜度應該是o(k

∗log

n)

o(k*logn)

o(k∗lo

gn),優先佇列的空間複雜度為o(n

+k

)o(n+k)

o(n+k)

#include "bits/stdc++.h"

#define hhh printf("hhh\n")

#define see(x) (cerr<<(#x)<<'='<<(x)inline int read()

const int maxn = 5e5+10;

const int inf = 0x3f3f3f3f;

const int mod = 1e9+7;

const double eps = 1e-7;

int n, nn, k, l, r;

int a[maxn], b[maxn];

int root[maxn], ls[maxn<<5], rs[maxn<<5];

int sz[maxn<<5], sum[maxn<<5], tot;

void update(int x, int l, int r, int pre, int &now)

int qk(int k, int x, int y, int l, int r)

struct p);

int cnt=0; ll ans=0;

while(1) );

}printf("%lld\n", ans);

}

主席樹 HYSBZ 2006 超級鋼琴

小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級 和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度...

st表 貓樹 堆 貪心 超級鋼琴

描述 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美...

洛谷P2048 超級鋼琴 堆 主席樹

乙個長度為n n的序列,求m m個長度在 l,r l r 之間的子串行,使得這些子串行的元素之和最大。顯然暴力是很難搞的,考慮先用字首和。那麼我們要求的就是 i 1mm ax s um k su m x 1 x l 1 k x r 1 i 1 m max sum k s um x 1 x l 1 k...