洛谷 P2048 NOI2010 超級鋼琴

2021-08-17 03:12:47 字數 908 閱讀 1752

給出乙個序列,求和最大的k個連續子串行的和,且連續子串行長度在l與r之間.

首先預處理出字首和,我們可以從左端點開始考慮,若左端點為i,則右端點在i+l-1與i+r-1之間,那麼可以計算出這些區間的最大值,然後放到堆裡去,每次從堆中取出最大值加到ans中後再將該區間左右兩區間的最大值放入堆中.

也就是說我們維護乙個結構體(i,l,r,mx)表示左端點為i,右端點在l,r之間的,且這些區間中最大的乙個區間的右端點為mx,那麼當這個結構體從堆中彈出來後,我們可以將結構體(i,l,mx-1,max(l~mx-1))和結構體(i,mx+1,r,max(mx+1~r))放到堆裡,利用st表,我們可以快速求出max(l~mx-1)和max(mx+1~r),重複k次計算最大值的和即可.

#include

#include

#include

#define ll long long

#define n 500100

using namespace std;

ll n,m,l,r,num[n],qz[n],st[20][n],pos[20][n],ans,lg[n];

struct node

}node[n],tmp,t2;

priority_queue

pq;inline ll lo(ll u)

inline ll ask(ll u,ll v)

int main()

for(i=1;(1 << i)<=n;i++)

else}}

for(i=1;i+l-1<=n;i++)

for(i=1;i<=m;i++)

t2=tmp;

t2.left=t2.mx_pos+1;

if(t2.left<=t2.right)

}cout<}

洛谷P2048 NOI2010 超級鋼琴 題解

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

P2048 NOI2010 超級鋼琴

小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為...

P2048 NOI2010 超級鋼琴

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