bzoj 2006 NOI2010 超級鋼琴

2021-07-01 19:39:40 字數 1790 閱讀 6339

小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,表示按編號從小到大每個音符的美妙度。

只有乙個整數,表示樂曲美妙度的最大值。

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。

這題做法還是非常神奇的

用s表示a的字首和。那麼和弦的值我們可以用s來表示了。

因為k的值很大。所以不可能樸素列舉

考慮哪些和弦會對ans有貢獻。

我們可以用堆按照x維護乙個五元組(s,l,r,d,x),表示s為起點,可以到達區間[l,r],中間最大值為x,位置為d。

每次從堆頂取出乙個元素把x加入答案

然後我們把這個元素分割成(s,l,d-1,d1,x1)和(s,d+1,r,d2,x2)

最大值用線段樹或者st表維護下就可以了

#include#include#include#includeusing namespace std;

long long inf=(long long)100000000*(long long)100000;

struct tree

tr[4000001];

long long a[500001];

long long s[500001];

inline void up(int p)

else

}inline void build(int p,int l,int r)

else

}tree nw;

inline tree ask(int p,int l,int r)

if(r>mid)

if(flag1)

else

}else

as=ans1;

}else

as=ans2;

return as;

}}long long ans;

struct findx

if(t.d+1<=t.r)

p++;

}}int main()

build(1,1,n);

while(!q.empty())

q.pop();

for(i=1;i<=n;i++)

solve();

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

return 0;

}

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...

BZOJ 2006 NOI2010 超級鋼琴

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