2006 NOI2010 超級鋼琴

2021-08-08 01:29:44 字數 875 閱讀 8520

題目鏈結

題目大意:給定乙個序列,要求找到連續的序列滿足長度在[l,r]範圍內,詢問前k大的滿足條件的序列的和

題解:首先把區間和變為區間端點的字首和相減

假設已經確定了所選區間的右端點,那麼左端點則被固定在乙個範圍內

可以用st表查詢區間最值。初始把每個可行的右端點找出最優的左端點扔進堆裡

當取出乙個最優左端點之後,對於這個右端點就不能取這個左端點了,需要刪掉它,設要在[a,b]中刪掉y,把[a,b]**成[a,y-1]和[y+1,b]再加入就好了

這樣,堆中存放乙個四元組(sum,x,a,b),分別代表區間和,右端點,合法左端點的區間端點

我的收穫:刪除區間中點的方法,神奇思想

#include 

#include

#include

#include

#include

using

namespace

std;

const

int m=500010;

typedef pair pii;

priority_queue> q;

#define mp(a,b,c,d) make_pair(make_pair(a,b),make_pair(c,d))

int n,m,l,r;

long

long ans;

int f[m][20],v[m],s[m];

int mi(int a,int b)

void st()

void work()

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

} void init()

int main()

2006 NOI2010 超級鋼琴

rmq heap 區間 對於任意區間右端點i,其左端點取值在l,r之間,若左端點為m,則v為max sum i sum m 1 顯然這裡i是不變的,所以可以用rmq查詢m的位置,然後計算v。現將所有右端點掃一遍,然後扔到堆裡面,堆中節點記錄的是決策,即右端點i,左端點區間,優先順序由v決定。然後取出...

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。我們定義超級和弦的美妙度為...