BZOJ 2006 NOI2010 超級鋼琴

2022-07-25 15:15:18 字數 2081 閱讀 2839

descriptiondescription

有 nn 個音符,編號為 11 至 nn 。第 ii 個音符的美妙度為 aiai 。

我們要找到 kk 段超級和弦組成的樂曲,每段連續的音符的個數 xx 滿足 l≤x≤rl≤x≤r ,求樂曲美妙度的最大值。

solutionsolution

貪心 + 堆 + rmq

首先可以看到,每段超級和弦都是連續的,美妙度是這段區間內所有美妙度的和。可以想到,每次求解區間和顯然是不合算的,所以考慮到用字首和。

考慮暴力,我們需要把所有滿足條件的字段抽出來排個序,但這實在是不可想象。所以考慮使用貪心思想來解決這個問題。

先想預處理。我們定義 max(o,l,r)=maxmax(o,l,r)=max ,即以 oo 為右端點,左端點範圍是 [l,r][l,r] 的最大子段。求 sum()sum() 就用前面說的字首和。可以看出,oo 的位置是固定的。所以 sum(o)sum(o) 也是固定的。所以我們要求這個的最大值,只要 sum(t−1)sum(t−1) 最小就可以了。即要求 sum(t−1)sum(t−1) 在 [l,r][l,r] 中的最小值,那怎麼快速地求出這個最大值呢?很顯然,這不是 rmqrmq 的活麼。對 rmqrmq 不熟悉的可以參考這 。當然,具體計算的時候還要看看下界 ll 是否低於了 11 。

接下來想怎麼貪心。我們可以每次都選最優的子段,這樣選 kk 次顯然就是我們所要的結果,那怎麼找到最優解呢?用堆來將解存進去,每次堆頂的元素就是最優解。

考慮乙個三元組 (o,l,r)(o,l,r) 表示以 oo 為右端點,左端點的選擇區間為 [l,r][l,r] 的 情況,我用了乙個 structstruct 來表示這個三元組,但往往實際上每個情況需要額外記錄這個情況的最優解 tt ,這個不麻煩,在 structstruct 裡面敲乙個建構函式就可以了。

我們假設當前最大的三元組是 (o,l,r)(o,l,r) 。最優解位置是 tt 。ansans 累加這個三元組的貢獻。由於 tt 已經被選中,對於這個 oo, tt 已經不能重複選中,但最優解還可能存在於 tt 左右的兩端區間中,所以提取出 (o,l,r)(o,l,r) 之後,為了避免重複且不喪失其他較優解,我們仍然要把 (o,l,t−1)(o,l,t−1) , (o,t+1,r)(o,t+1,r) 扔回堆裡面去。顯然地,在放回去之前應該保證區間的存在,即 l=tl=t 或 r=tr=t 的情況要進行特判。

最後實現的時候還要注意一點,rmqrmq 原本陣列裡面記錄的是最優解的值,但我們查詢區間最大值的時候查詢的是最優解的位置。所以陣列裡面存的是最優解的位置,要特殊處理。

codecode

#include

#include

#include

#include

#include

#include

#define maxn 500005

#define log 20

#define max(x, y) ((x) > (y) ? (x) : (y))

#define min(x, y) ((x) < (y) ? (x) : (y))

long long sum[maxn], st[maxn][log];

namespace rmq

void init(int n)

int query(int l, int r)

}struct element

element(int o, int l, int r) : o(o), l(l), r(r), t(rmq::query(l, r)) {}

friend bool operator < (const element& a, const element& b)

};std::priority_queue< element > q;

int main()

rmq::init(n);

for (int i = l; i <= n; i++)

q.push(element(i, max(1, i - r + 1), i - l + 1));

long long ans = 0;

while (k--)

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

return 0;

}————————————————

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