題目鏈結
題目大意:給定乙個序列,要求找到連續的序列滿足長度在[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。我們定義超級和弦的美妙度為...