BZOJ2006 NOI2010 超級鋼琴

2022-05-02 15:42:09 字數 2832 閱讀 3581

time limit: 20 sec  memory limit: 552 mb

submit: 3234  solved: 1594

[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。

【題解】

初始時,對於每乙個右端點,他所選的最優左端點很容易求出:字首和+st表

貪心選區間和最大的(堆實現)。選了某個右端點i,對應左端點pos後,

只要i不被選,以i為右端點的區間的左端點不是pos的區間就不可能被選

pos被選了之後

我們不難發現

右端點i的最優左端點在i - r + 1, pos - 1 和 pos + 1, i - l + 1裡面

取兩個左端點最優值壓入堆中嘛?當然不是,兩個左端點都應加入堆中。

兩個端點乙個能構成最大,另乙個可能構成次大。

因long long和st表的ij弄反被卡

1 #include 2 #include 3 #include 4 #include 5 #include 6 #include 7

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

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

910 inline void read(long

long &x)

1117

18const

long

long maxn = 500000 + 10;19

const

long

long maxk = 500000 + 10;20

21long

long n,k,l,r,num[maxn],st[20][maxn],rank[20][maxn],m,pow2[30

],ans;

2223

struct

node

24

27node(){}

28};

2930

struct

c***1

36};

3738 std::priority_queue, cmp>q;

3940

void

yuchuli()

4153

else

5458}59

}6061long

long find(long

long l, long

long

r)62

69long

long m = 0;70

while(pow2[m] <= (r - l + 1))++m;

71 --m;

72if(st[m][l] < st[m][r - pow2[m] + 1

])73

return

rank[m][l];

74else

75return rank[m][r - pow2[m] + 1

];76}77

78int

main()

7990

yuchuli();

91for(register long

long i = l;i <= n;++i)

9296

long

long now = 0;97

register node tmp;

98 register long

long

pos;

99for(;now < k;++now)

100109

if(tmp.r >= tmp.rank + 1

)110

114}

115 printf("

%lld

", ans);

116return0;

117 }

bzoj2006

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