我能說這是主席樹板子題嘛?
題意:給定乙個序列,求長度在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...