2006 NOI2010 超級鋼琴

2021-07-09 03:19:26 字數 624 閱讀 5305

rmq+heap+區間**。

對於任意區間右端點i,其左端點取值在l,r之間,若左端點為m,則v為max(sum[i]-sum[m-1]),顯然這裡i是不變的,所以可以用rmq查詢m的位置,然後計算v。

現將所有右端點掃一遍,然後扔到堆裡面,堆中節點記錄的是決策,即右端點i,左端點區間,優先順序由v決定。

然後取出堆頂,v加到ans裡去,**[l,r]為[l,m-1]和[m+1,r],rmq出新的v,再將**後的區間加到堆裡。

重複k次就好了。

#include#include#include#includeusing namespace std;

const int n=500000+5;

typedef long long ll;

struct heapnode{

int i,l,r,v,m;

bool operator<(const heapnode &rhs)const{

return vq;

ll ans=0;

int l,r,v,m,i;

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

l=i-r+1;r=i-l+1;

l=max(l,1);r=max(r,1);

if(i-l+1

2006 NOI2010 超級鋼琴

題目鏈結 題目大意 給定乙個序列,要求找到連續的序列滿足長度在 l,r 範圍內,詢問前k大的滿足條件的序列的和 題解 首先把區間和變為區間端點的字首和相減 假設已經確定了所選區間的右端點,那麼左端點則被固定在乙個範圍內 可以用st表查詢區間最值。初始把每個可行的右端點找出最優的左端點扔進堆裡 當取出...

2006 NOI2010 超級鋼琴

time limit 20 sec memory limit 552 mb submit 2634 solved 1313 submit status discuss 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個...

bzoj 2006 NOI2010 超級鋼琴

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