time limit: 20 sec memory limit: 552 mb
submit: 2634 solved: 1313
[submit
][status
][discuss
]小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【樣例說明】
共有5種不同的超級和弦:
音符1 ~ 2,美妙度為3 + 2 = 5
音符2 ~ 3,美妙度為2 + (-6) = -4
音符3 ~ 4,美妙度為(-6) + 8 = 2
音符1 ~ 3,美妙度為3 + 2 + (-6) = -1
音符2 ~ 4,美妙度為2 + (-6) + 8 = 4
最優方案為:樂曲由和弦1,和弦3,和弦5組成,美妙度為5 + 2 + 4 = 11。
這題只知道要找乙個最大值,也不知如何下手,被續掉了一整天,只知道要先求乙個字首和,以第i個元素結尾的和最大的序列就是sum[i]-min(i-r<=j<=i-l)。。。
後來看了題解,發現可以用主席樹/劃分樹維護區間k大值,然後再用堆維護結果
我一想:這不是mdzz嗎?我不會寫劃分樹。
在otz了一下午後,我得(cha)出了乙個結論:以第i個元素開始的和最大的序列就是max-sum[i](j-r<=i<=j-l)。。。
咦這不是一開始就得出了麼?
但是,我突然想起乙個玄妙的東西——st表
哦。。。所以只要預處理出一張st表,你就可以對每乙個i預處理出它開始的最大美妙和諧,然後o(n)查詢一遍即可。複雜度上界為o(nlogn + k log(n+k))
無限仰膜hzwer學長
st表請移步
#include#define ll long longview code#define n 500010
using
namespace
std;
struct
tritmp;
ll n,k,l,r,a[n],log[n],mx[n][
20],bin[20
],ans;
inline
bool
operator
inline ll query(ll l,ll r)
void
pre()
else
break;}
priority_queue
q;int
main());
}for(ll i=1;i<=k;i++)
);if(t.t+1
<=t.r)q.push((tri));
}cout
<
}
2006 NOI2010 超級鋼琴
rmq heap 區間 對於任意區間右端點i,其左端點取值在l,r之間,若左端點為m,則v為max sum i sum m 1 顯然這裡i是不變的,所以可以用rmq查詢m的位置,然後計算v。現將所有右端點掃一遍,然後扔到堆裡面,堆中節點記錄的是決策,即右端點i,左端點區間,優先順序由v決定。然後取出...
2006 NOI2010 超級鋼琴
題目鏈結 題目大意 給定乙個序列,要求找到連續的序列滿足長度在 l,r 範圍內,詢問前k大的滿足條件的序列的和 題解 首先把區間和變為區間端點的字首和相減 假設已經確定了所選區間的右端點,那麼左端點則被固定在乙個範圍內 可以用st表查詢區間最值。初始把每個可行的右端點找出最優的左端點扔進堆裡 當取出...
bzoj 2006 NOI2010 超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為...