超級鋼琴
【問題描述】
小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
-68【樣例輸出】
11【樣例說明】
共有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。
題解:設三元組 (l, r, i) 表示以 i 為開始,以某個 j (l
我們記錄字首和 sum,對於以 i 為開始的字首, sum[i-1] 是確定的,即只要得到最大的 sum[j] (l
即查詢 l 到 r 之間的最大的 sum
一開始我們將所有 (i + l - 1, i + r - 1, i) 加入大根堆中,保證和弦長度在 l 到 r 之間
每次取出堆頂的標號,記為s
把這個三元組 (l, r, i) 拆成 (l, s - 1, i) 和 (s + 1, r, i) 兩個三元組,再次加入堆中(因為這兩個答案也有可能比其他 i 的答案優)
重複這個操作,直到取了k次
1 #include2 #include3 #include4 #include5 #include6 #include7 #include8using
namespace
std;
9const
int maxn = 5e5 + 1;10
intlogn;
11int
n, k;
12int lg[maxn], bin[19
];13
intsum[maxn];
14 inline void scan(int &x)
1523
struct
rmq24
;27 rmq maxx[19
][maxn];
28struct
interval29;
32 inline bool
operator
<(interval a, interval b)
3336 priority_queue q;
37inline rmq max(rmq a, rmq b)
3841 inline bool
operator
<(rmq a, rmq b)
4245 inline void
rmq()
4654
}55 inline int query(int l, int
r)56
61int
main()62;
74}75rmq();
76interval s;
77int
x, u, v, a, b;
78for(int i = 1; i <= n - l + 1; ++i)79;
83q.push(s);84}
85long
long ans = 0;86
while(k--)
87);
94if(v > 0) q.push((interval) );95}
96 printf("
%lld
", ans);
97 }
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...