P2048 NOI2010 超級鋼琴

2021-09-27 11:28:32 字數 1427 閱讀 8525

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

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

輸入 #1複製

4 3 2 332

-68

輸出 #1複製

11
#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], table[maxn][log];

namespace rmq

}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 = 1; i <= n; i++)

if (i + l - 1 <= n)

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

long long ans = 0;

while (k--)

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

return 0;

}

P2048 NOI2010 超級鋼琴

和十二省聯考d1t2相似的思路 用堆維護最大值,取出乙個位置之後把這個位置的下乙個值插入堆 注意插入的數有負數,並且開long long include include include include define int long long using namespace std struct q...

洛谷 P2048 NOI2010 超級鋼琴

給出乙個序列,求和最大的k個連續子串行的和,且連續子串行長度在l與r之間.首先預處理出字首和,我們可以從左端點開始考慮,若左端點為i,則右端點在i l 1與i r 1之間,那麼可以計算出這些區間的最大值,然後放到堆裡去,每次從堆中取出最大值加到ans中後再將該區間左右兩區間的最大值放入堆中.也就是說...

洛谷P2048 NOI2010 超級鋼琴 題解

近期發現這篇題解有點爛,更新一下,刪繁就簡,詳細重點。多加了注釋。就醬紫啦!我們需要先算美妙度的字首和,並初始化rmq。迴圈 i 從 1 到 n 因為以i為起點的和弦終點必定是 i l 1 到 i r 1 之間,所以只要在區間內用rmq取超級和弦,並加入以美妙度從小排到大的優先佇列中。取出堆頂元素,...