社区讨论

only WA on #4,双倍经验能过

P2034选择数字参与者 1已保存回复 1

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
1 条
当前快照
1 份
快照标识符
@mkrziagf
此快照首次捕获于
2026/01/24 15:24
4 周前
此快照最后确认于
2026/01/24 19:18
4 周前
查看原帖
CPP
#include<bits/stdc++.h>
#define int long long
using namespace std;
#define getchar getchar_unlocked
inline long long read() {
    long long x = 0, f = 1;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-') f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        x = x * 10 + (c - '0');
        c = getchar();
    }
    return x * f;
}
int n,k;
int a[1000006];
int f[1000005][10];
int pre[1000005];
deque<int>dq;
inline void add(int x){
    while(!dq.empty()&&dq.back()<=x)
        dq.pop_back();
    dq.push_back(x);
}
inline void del(int x){
    if(dq.front()==x) dq.pop_front();
}
signed main(){
    n=read(),k=read();
    for(int i=1;i<=n;i++){
        a[i]=read();
        pre[i]=pre[i-1]+a[i];
        f[i][1]=a[i];
    }
    int ans=0;
    for(int i=1;i<=n;i++){
        f[i][0]=max(f[i-1][0],f[i-1][1]);
        int cnt=-1e9;
        // for(int j=max(0LL,i-k);j<i;j++){
        //     cnt=max(cnt,f[j][0]-pre[j]);
        // }
        add(f[i][0]-pre[i]);
        if(i<=k) f[i][1]=pre[i];
        else {
            del(f[i-k-1][0]-pre[i-k-1]);
            f[i][1]=dq.front()+pre[i];
        }
        ans=max({f[i][0],f[i][1],ans});
    }
    printf("%lld",ans);
}

回复

1 条回复,欢迎继续交流。

正在加载回复...