(玄关)输出与数据一样,但WA0
查看原帖
(玄关)输出与数据一样,但WA0
1174964
ncws楼主2025/7/19 15:51
#include<bits/stdc++.h>
#define int long long
#define len(l,r) r-l+1
#define s(x) (1<<x)
using namespace std;
struct node{
    int l,r1,r2,jz,lar;
    bool operator<(const node &rhs)const{return jz<rhs.jz;}
}tp;
priority_queue<node>q;
int n,k,l,r,id,ans=0,bz[500005],a[500005],sum[500005],st[500005][20/*2^18<500000<2^19*/],num[500005][20];
void yu(){
    bz[1]=0;
    bz[2]=1;
    for(int i=3;i<=500005;i++)bz[i]=bz[i/2]+1;
    for(int i=1;i<=n;i++){
        st[i][0]=sum[i];
        num[i][0]=i;
    }
    for(int j=1;j<=19;j++)
        for(int i=1;i+s(j)<=n+1;i++)
            if(st[i][j-1]>st[i+s(j-1)][j-1]){
                st[i][j]=st[i][j-1];
                num[i][j]=num[i][j-1];
            }else{
                st[i][j]=st[i+s(j-1)][j-1];
                num[i][j]=num[i+s(j-1)][j-1];
            }
}
int maxx(int l,int r,int &id){
    int flag=(st[l][bz[len(l,r)]]>st[r-s(bz[len(l,r)])+1][bz[len(l,r)]])?1:0;
    id=flag?num[l][bz[len(l,r)]]:num[r-s(bz[len(l,r)])+1][bz[len(l,r)]];
    return flag?st[l][bz[len(l,r)]]:st[r-s(bz[len(l,r)])+1][bz[len(l,r)]];
}
signed main(){
    scanf("%lld%lld%lld%lld",&n,&k,&l,&r);
    for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
    for(int i=1;i<=n;i++)sum[i]=sum[i-1]+a[i];
    yu();
    for(int i=1;i<=len(l,n);i++)q.push({i,i+l-1,min(i+r-1,n),maxx(i+l-1,min(i+r-1,n),id)-sum[i-1],id});
    for(int i=1;i<=k;i++){
        tp=q.top();
        q.pop();
        ans+=tp.jz;
        if(tp.lar>tp.r1)q.push({tp.l,tp.r1,tp.lar-1,maxx(tp.r1,tp.lar-1,id)-sum[tp.l-1],id});
        if(tp.lar<tp.r2)q.push({tp.l,tp.lar+1,tp.r2,maxx(tp.lar+1,tp.r2,id)-sum[tp.l-1],id});
    }
    printf("%lld",ans);
    return 0;
}

数据输入1:

10 13 3 7
595
384
-435
-197
-677
661
4
-100
-653
220

数据输出1

1112

我的输出 评测结果: 不理解!!!

求调!!!

2025/7/19 15:51
加载中...