感觉自己和第一篇题解的做法是一样的,然而样例始终输出8。
#include <bits/stdc++.h>
using namespace std;
inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+(ch^48);ch=getchar();}return x*f;}
inline void write(int x){if (x < 0) x = ~x + 1, putchar('-');if (x > 9) write(x / 10);putchar(x % 10 + '0');}
inline void writeln(int x){write(x);putchar('\n');}
inline void writesp(int x){write(x);putchar(' ');}
int s[500005],f[500005][30],ans;
//ST 表
void init(int n)
{
for(int j=1;j<log2(n)+1;j++)
for(int i=1;i+(1<<j)-1<=n;i++)
f[i][j]=s[f[i][j-1]]>s[f[i+(1<<(j-1))][j-1]]?f[i][j-1]:f[i+(1<<(j-1))][j-1];
}
int Q(int l,int r)
{
int k=log2(r-l+1);
return s[f[l][k]]>s[f[r-(1<<k)+1][k]]?f[l][k]:f[r-(1<<k)+1][k];
}
struct S{
int le,rl,rr,t;
bool operator < (S b) const
{
return s[t]-s[le-1]<s[b.t]-s[b.le-1];
}
};
priority_queue<S> q;
int main()
{
int n=read(),k=read(),l=read(),r=read();
for(int i=1;i<=n;i++)
{
s[i]=read()+s[i-1];
f[i][0]=i;
}
init(n);
for(int i=1;i+l-1<=n;i++)
{
q.push({i,i+l-1,min(i+r-1,n),Q(i+l-1,i+r-1)});
}
for(int i=1;i<=k;i++)
{
S t=q.top();
q.pop();
ans+=s[t.t]-s[t.le-1];
if(t.rl<=t.t-1)q.push({t.le,t.rl,t.t-1,Q(t.rl,t.t-1)});
if(t.t+1<=t.rr)q.push({t.le,t.t+1,t.rr,Q(t.t+1,t.rr)});
}
writeln(ans);
return 0;
}