luoguP2048 NOI2010 超級鋼琴

2022-05-07 20:42:12 字數 1176 閱讀 3488

解析:

先考慮暴力:將每個區間求出來,放進乙個堆裡,取出前k個就是答案。

期望得分:20,原因:tle

code(對,我真寫了):

#includeusing namespace std;

const int maxn=5*1e5+10;

int n,k,l,r,ans;

int sum[maxn];

priority_queueq;

int main()

考慮優化,先看這道題

這道題中我們並沒有將所有的組合全部求出,而是先將一些最優解放入堆中,取出後放入次於它的最優解來更新。

這道題也可以用相同的方法來優化。

首先區間和肯定用字首和優化了。

我們先固定左端點,將從每個點向右的最優解放入,記為四元組:\((x,l,r,t)\),\(x\)是左端點,\(l\)和\(r\)是右端點的範圍,t是當前解的右端點的位置。求解該區間的最優解可以用st表解決。

將這些數放入後,我們每從堆中取出乙個四元組\((x,l,r,t)\),加上它的答案後,向堆中放入\((x,l,t-1,query(l,t-1))\)和\((x,t+1,query(t+1,r))\)(相當於放入對於\(x\)的\([l,r]\)區間除去\(t\)後的最優解,注意判斷\(l,r\)是否為\(t\))

取\(k\)次即為答案。

之前做過的題思想還是要記住的~

code:

#includeusing namespace std;

typedef long long ll;

const int maxn=5*1e5+10;

int n,k,l,r;

int st[maxn][30];

ll ans;

ll sum[maxn];

void init()

}int query(int l,int r)

struct node

);//puts("111");

//puts("11");

while(k--)

);if(r!=t) q.push((node));

//puts("111");

} printf("%lld",ans);

return 0;

}

luogu P2048 NOI2010 超級鋼琴

傳送門 編號好評 先把所有數記個字首和,然後對於某乙個右端點 r r geq l 能計入答案的 l 的範圍為 max r r,0 r l 可以開乙個大根堆,先對於所有右端點 r 加入 pre r min pre 然後每次取出堆頂加入答案,彈掉堆頂,同時如果這是堆頂對應右端點減第 k 小的左端點的值,...

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