解析:
先考慮暴力:將每個區間求出來,放進乙個堆裡,取出前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...