http://www.lydsy.com/JudgeOnline/problem.php?id=2006
输出最大的k个 sum[r]-sum[l-1] (L<=r-l+1<=R) 之和
当右端点固定不变时,左端点的前缀和越小越好
固定右端点r后,左端点的被限制在了区间[r-R,r-L]内
RMQ查出在这段左端点区间内,左端点前缀和的最小值
把所有的这些放到一个大根堆里
取出一个元素后
若原区间[a,b] 左端点选的位置是p
那么原区间分裂为两个区间[a,p-1] 和 [p+1,b]
即 若原来区间的右端点是End,左端点可选区间为[a,b]
那么当[a,b]内选位置p当左端点,且作为前k大用过后,
右端点为End的区间可选左端点变成了 [a,p-1],[p+1,b],放入堆中即可
#include<queue>
#include<cmath>
#include<cstdio>
#include<iostream>
#include<algorithm> using namespace std; #define N 500001 struct node
{
int l,r;
int End;
int pos,val; bool operator < (node p) const
{
return val<p.val;
}
}nxt; priority_queue<node>q; int sum[N];
int mi[N][]; void read(int &x)
{
x=; int f=; char c=getchar();
while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
while(isdigit(c)) { x=x*+c-''; c=getchar(); }
x*=f;
} int find(int l,int r)
{
int k=log(r-l+)/log();
return sum[mi[l][k]]<sum[mi[r-(<<k)+][k]] ? mi[l][k] : mi[r-(<<k)+][k];
} int main()
{
freopen("piano.in","r",stdin);
freopen("piano.out","w",stdout);
int n,k,L,R;
read(n);
read(k);
read(L);
read(R);
for(int i=;i<=n;++i)
{
read(sum[i]);
sum[i]+=sum[i-];
mi[i][]=i;
}
for(int j=,k=;k<<<=n;++j,k<<=)
for(int i=;i+(k<<)-<=n;++i)
if(sum[mi[i][j-]]<sum[mi[i+k][j-]]) mi[i][j]=mi[i][j-];
else mi[i][j]=mi[i+k][j-];
node tmp;
for(int i=;i<=n;++i)
{
tmp.End=i;
tmp.l=max(i-R,);
tmp.r=i-L;
if(tmp.l>tmp.r) continue;
tmp.pos=find(tmp.l,tmp.r);
tmp.val=sum[i]-sum[tmp.pos];
q.push(tmp);
}
long long ans=;
while(k--)
{
tmp=q.top();
ans+=tmp.val;
q.pop();
nxt.End=tmp.End;
if(tmp.pos!=tmp.l)
{
nxt.pos=find(tmp.l,tmp.pos-);
nxt.l=tmp.l;
nxt.r=tmp.pos-;
nxt.val=sum[nxt.End]-sum[nxt.pos];
q.push(nxt);
}
if(tmp.pos!=tmp.r)
{
nxt.pos=find(tmp.pos+,tmp.r);
nxt.l=tmp.pos+;
nxt.r=tmp.r;
nxt.val=sum[nxt.End]-sum[nxt.pos];
q.push(nxt);
}
}
cout<<ans;
}
2006: [NOI2010]超级钢琴
Time Limit: 20 Sec Memory Limit: 552 MB
Submit: 3473 Solved: 1714
[Submit][Status][Discuss]
Description
Input
Output
只有一个整数,表示乐曲美妙度的最大值。
Sample Input
3
2
-6
8
Sample Output
【样例说明】
共有5种不同的超级和弦:
音符1 ~ 2,美妙度为3 + 2 = 5
音符2 ~ 3,美妙度为2 + (-6) = -4
音符3 ~ 4,美妙度为(-6) + 8 = 2
音符1 ~ 3,美妙度为3 + 2 + (-6) = -1
音符2 ~ 4,美妙度为2 + (-6) + 8 = 4
最优方案为:乐曲由和弦1,和弦3,和弦5组成,美妙度为5 + 2 + 4 = 11。