这是我AC代码:
#include<bits/stdc++.h>
#define int long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,k,L,R,sum[500005],ans;
struct node{
int o,l,r,t;
friend bool operator < (const node &a,const node &b){
return sum[a.t]-sum[a.o]<sum[b.t]-sum[b.o];
}
};
priority_queue<node>q;
struct ST{
int l,r,mxid;
}t[2000005];
void build(int id,int l,int r){
t[id].l=l;
t[id].r=r;
if(l==r){
t[id].mxid=l;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
if(sum[t[ls].mxid]<sum[t[rs].mxid])t[id].mxid=t[rs].mxid;
else t[id].mxid=t[ls].mxid;
}
int query(int id,int l,int r){
if(t[id].l>r||t[id].r<l)return n+1;
if(t[id].l>=l&&t[id].r<=r){
return t[id].mxid;
}
int ld=query(ls,l,r),rd=query(rs,l,r);
if(sum[ld]<sum[rd])return rd;
else return ld;
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>k>>L>>R;
for(int i=1,a;i<=n;i++){
cin>>a;
sum[i]=sum[i-1]+a;
}
sum[n+1]=-1e18;
build(1,1,n);
for(int i=1;i<=n;i++){
int o=i-1,l=i+L-1,r=min(i+R-1,n),t=query(1,l,r);
if(l>n)continue;
q.push({o,l,r,t});
}
for(int i=1;i<=k;i++){
auto x=q.top();
q.pop();
int o=x.o,l=x.l,r=x.r,t=x.t,lt,rt;
ans+=sum[t]-sum[o];
if(l!=t){
lt=query(1,l,t-1);
q.push({o,l,t-1,lt});
}
if(r!=t){
rt=query(1,t+1,r);
q.push({o,t+1,r,rt});
}
}
cout<<ans;
}
这是我20分代码:
#include<bits/stdc++.h>
#define int long long
#define ls (id<<1)
#define rs (id<<1|1)
using namespace std;
int n,k,L,R,sum[500005],ans;
struct node{
int o,l,r,t;
friend bool operator < (const node &a,const node &b){
return sum[a.t]-sum[a.o]<sum[b.t]-sum[b.o];
}
};
priority_queue<node>q;
struct ST{
int l,r,mxid;
}t[2000005];
void build(int id,int l,int r){
t[id].l=l;
t[id].r=r;
if(l==r){
t[id].mxid=l;
return;
}
int mid=(l+r)>>1;
build(ls,l,mid);
build(rs,mid+1,r);
if(sum[t[ls].mxid]<sum[t[rs].mxid])t[id].mxid=t[rs].mxid;
else t[id].mxid=t[ls].mxid;
}
int query(int id,int l,int r){
if(t[id].l>r||t[id].r<l)return n+1;
if(t[id].l>=l&&t[id].r<=r){
return t[id].mxid;
}
int ld=query(ls,l,r),rd=query(rs,l,r);
if(sum[ld]<sum[rd])return rd;
else return ld;
}
void read(int &x) {
char c;
do {
c = getchar();
} while (c == ' ' || c == '\n');
x = 0;
int w = 1;
if (c == '-') {
w = -1;
c = getchar();
}
do {
x = (x << 1) + (x << 3) + c - '0';
c = getchar();
} while (c != ' ' && c != '\n');
x *= w;
}
signed main(){
read(n);
read(k);
read(L);
read(R);
for(int i=1,a;i<=n;i++){
read(a);
sum[i]=sum[i-1]+a;
}
sum[n+1]=-1e18;
build(1,1,n);
for(int i=1;i<=n;i++){
int o=i-1,l=i+L-1,r=min(i+R-1,n),t=query(1,l,r);
if(l>n)continue;
q.push({o,l,r,t});
}
for(int i=1;i<=k;i++){
auto x=q.top();
q.pop();
int o=x.o,l=x.l,r=x.r,t=x.t,lt,rt;
ans+=sum[t]-sum[o];
if(l!=t){
lt=query(1,l,t-1);
q.push({o,l,t-1,lt});
}
if(r!=t){
rt=query(1,t+1,r);
q.push({o,t+1,r,rt});
}
}
cout<<ans;
}
可以清晰的看出这两个代码只是一个用cin+关流同步,另一个用快读。
然额当我傻乎乎下载第一个数据时,发现:

灵异事件!