bzoj 2006 NOI2010 超級鋼琴

2022-05-11 02:39:57 字數 1243 閱讀 9343

小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的

**。 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。 乙個「超級

和弦」由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為其包含的

所有音符的美妙度之和。兩個超級和弦被認為是相同的,當且僅當這兩個超級和弦所包含的音符集合是相同的。

小z決定創作一首由k個超級和弦組成的樂曲,為了使得樂曲更加動聽,小z要求該樂曲由k個不同的超級和弦組成。

我們定義一首樂曲的美妙度為其所包含的所有超級和弦的美妙度之和。小z想知道他能夠創作出來的樂曲美妙度最

大值是多少。

正解:貪心

套路題,這題我們顯然是要取出前k大的子串,容易發現對於乙個右端點r,記字首和為 \(sum[i]\),那麼一定是取出某個滿足限制且最小的 \(sum[i]\),但是樣例良心的提醒了我們:乙個端點可以取次小和次次小等等,所以還需要乙個套路:拆區間。我們定義乙個子串 \((l,r,p,val,i)\),表示當前可以決策的區間是 \([l,r]\),上一次決策的最小值位置是 \(p\),區間和是 \(val\),右端點是 \(i\),的代價,我們把這個丟入堆中,然後沒選出乙個我們還需要拆 \([l,r]\) 為 \([l,p-1]\),\([p+1,r]\),因為乙個端點的次小值還可以產生貢獻,那麼次小值一定是兩個區間中的乙個,再次把兩個區間丟入堆中決策即可,對於最小值查詢我們可以用到st表 \(o(1)\) 查詢

#include #include #include #include #include #include #include #define rg register

#define il inline

#define iter iterator

#define max(a,b) ((a)>(b)?(a):(b))

#define min(a,b) ((a)<(b)?(a):(b))

using namespace std;

typedef long long ll;

const int n=500005;

struct node

node(int _l,int _r,int _p,int _val,int _id)

bool operator <(const node &pr)const

int main()

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