orz zzk
最直接的想法是找出所有不同的長度在[l,r]的子段然後選最大的k個加到答案中
但是太暴力沒前途啊
zzk教會我:
首先構造字首和陣列pre
定義乙個三元組max(i,l,r)表示以i為右端點且左端點在[l,r]之間的使pre[i]-pre[t-1]最大的值
(等價於[l,r]中使pre[t-1]最小的值) 其中(l<=t<=r)
顯然ans就是k個最大的這樣的三元組的值的和
可以用st表+堆
首先列舉i,用st表找到最小的pre[t] (作為初始狀態) 放入乙個堆中
然後進行k次查詢:每次找到堆頂計入ans,然後因為需要選出的子段各不相同,把(i,l,r)拆成(i,l,t-1)和(i,t+1,r)放入堆中
#include
#include
#include
#define n 500005
#define rg register
#define ll long long
#define maxlog 20
using
namespace
std;
inline
int read()
while(c>='0'&&c<='9')
return a*f;
}int n,l,r,k;
ll ans;
int pre[n],log[n+5],st[n][maxlog+5];
struct node
bool
operator
< (const node &c) const
};int min(int a,int b)
int query(int x,int y)
priority_queueheap;
int main()
ans=0;
for(i=1;i<=k;++i)
printf("%lld\n",ans);
return
0;}
bzoj 2006 NOI2010 超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度為...
BZOJ 2006 NOI2010 超級鋼琴
time limit 20 sec memory limit 552 mb submit 3254 solved 1604 小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai...
BZOJ 2006 NOI2010 超級鋼琴
小z是乙個小有名氣的鋼琴家,最近c博士送給了小z一架超級鋼琴,小z希望能夠用這架鋼琴創作出世界上最美妙的 這架超級鋼琴可以彈奏出n個音符,編號為1至n。第i個音符的美妙度為ai,其中ai可正可負。乙個 超級 和弦 由若干個編號連續的音符組成,包含的音符個數不少於l且不多於r。我們定義超級和弦的美妙度...