bzoj_2006_[noi2010]超級鋼琴_貪心+堆+st表
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的
**。 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。 乙個「超級
和弦」由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為其包含的
所有音符的美妙度之和。兩個超級和弦被認為是相同的,當且僅當這兩個超級和弦所包含的音符集合是相同的。
小z決定創作一首由k個超級和弦組成的樂曲,為了使得樂曲更加動聽,小z要求該樂曲由k個不同的超級和弦組成。
我們定義一首樂曲的美妙度為其所包含的所有超級和弦的美妙度之和。小z想知道他能夠創作出來的樂曲美妙度最
大值是多少。
第一行包含四個正整數n, k, l, r。其中n為音符的個數,k為樂曲所包含的超級和弦個數,l和r分別是超級和弦所
包含音符個數的下限和上限。 接下來n行,每行包含乙個整數ai,表示按編號從小到大每個音符的美妙度。
n<=500,000
k<=500,000
-1000<=ai<=1000,1<=l<=r<=n且保證一定存在滿足條件的樂曲
只有乙個整數,表示樂曲美妙度的最大值。
4 3 2 332
-6811把所有的子串當成字尾的字首來做。
那麼對於從i這個位置開始的子串,有乙個可以選取末位置j的範圍[i+l-1,i+r-1]。
假設最大的合法子串在j這個位置,那麼次大值一定出現在[i+l-1,j-1]和[j+1,i+r-1]中。
於是有了這樣的想法:用堆來維護四元組表示從i到p的子段,選擇的範圍從l到r。
然後每次查詢區間最大值用st表做即可。
**:
#include #include #include #include using namespace std;using namespace __gnu_pbds;
typedef long long ll;
#define n 500050
int n,a[n],s[n],k,l,r,f[n][21],lg[n],g[n][21];
ll ans;
struct a
a(int x_,int p_,int l_,int r_) :
x(x_),p(p_),l(l_),r(r_) {}
};bool operator < (const a &x,const a &y)
lg[0]=0;
for(j=1;(1}
}solve();
printf("%lld\n",ans);
}
bzoj 2006 NOI2010 超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為...
BZOJ 2006 NOI2010 超級鋼琴
orz zzk 最直接的想法是找出所有不同的長度在 l,r 的子段然後選最大的k個加到答案中 但是太暴力沒前途啊 zzk教會我 首先構造字首和陣列pre 定義乙個三元組max i,l,r 表示以i為右端點且左端點在 l,r 之間的使pre i pre t 1 最大的值 等價於 l,r 中使pre t...
BZOJ 2006 NOI2010 超級鋼琴
time limit 20 sec memory limit 552 mb submit 3254 solved 1604 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai...