幽默单调队列样例输出24求助

P2627 [USACO11OPEN] Mowing the Lawn G

ImposterAnYu @ 2024-08-08 14:32:54

#include <bits/stdc++.h>
#define int1 long long
#define N 100000
#define ANS(x) (dp[x][0] - sum[x])//单调队列维护的东西 
using namespace std;
int1 n,k,i,dp[N + 5][0],sum[N + 5],q[N + 5],head,tail;
int1 read(){//快读 
    int1 x = 0, f = 1;
    char ch = getchar();
    while (!isdigit(ch)){
        if (ch == '-'){
            f = -1;
        }
        ch = getchar();
    }
    while (isdigit(ch)){
        x = (x << 1) + (x << 3) + (ch ^ 48);
        ch = getchar();
    }
    return x * f;
}
void uprint(int1 x){//快写 
    if (x >= 10){
        uprint(x / 10);
    }
    putchar(x % 10 ^ 48);
    return ;
}
void print(int1 x){//快写 
    if (x < 0){
        putchar('-');
        x = -x;
    }
    uprint(x);
    return ;
}
void ps(int1 x){//快写+空格 
    print(x);
    putchar(' ');
    return ;
}
void pe(int1 x){//快写+换行 
    print(x);
    putchar('\n');
    return ;
}
int main(){
//原理:dp[i][1]=max(dp[j][0]-sum[j])+sum[i](i-k<=j<i)
//dp[i][0]=max(dp[i-1][0],dp[i-1][1])
//用单调队列维护dp[j][0]-sum[j]以O(1)更新dp[i][1] 
    n = read(),k = read();
    for(i = 1; i <= n; i++){
        sum[i] = sum[i - 1] + read();//前缀和 
    }
    head = 1,tail = 0;
    for(i = 1; i <= n; i++){
        dp[i][0] = max(dp[i - 1][0],dp[i - 1][1]);
        while(q[head] < i - k && head <= tail){//弹出队头 
            head++;
        }
        dp[i][1] = ANS(q[head]) + sum[i];//更新答案 
        while(ANS(i) > ANS(q[tail]) && head <= tail){//弹出队尾 
            tail--;
        }
        q[++tail] = i;//加入新元素 
    }
    pe(max(dp[n][0],dp[n][1]));
    return 0;
}

by join_in_team_64334 @ 2024-08-08 14:39:40

这边通过细致观察可以发现您的代码和第三篇题解有不可分割的缘分,建议使用高级工具文本比对器完成代码所需部分


by join_in_team_64334 @ 2024-08-08 14:40:00

的调试


by ImposterAnYu @ 2024-08-08 14:43:29

@Causality 乐


by ImposterAnYu @ 2024-08-08 14:46:45

@Causality 第三份题解对于队列的初始化是 head=tail=1,然而这么写相当于默认队列里初始有元素,个人认为是错误的

事实上,如果我也这么初始化,我的代码会输出 25,比 24 更逆天


by ImposterAnYu @ 2024-08-08 14:49:18

而且使用文本对比器后两份代码没一个地方是白色


by wizard(偷开O2 @ 2024-08-08 15:25:00

@Causality 现在帮人调代码都是看和哪篇题解相似然后直接《文本对比器》吗。

逆大天。


by join_in_team_64334 @ 2024-08-08 15:37:17

@wizard(偷开O2 没有,我帮别人调不用文本比对器,直接人眼比对就行了


by wizard(偷开O2 @ 2024-08-08 15:39:09

更逆天了。


by join_in_team_64334 @ 2024-08-08 15:44:20

@wizard(偷开O2 那您是如何帮别人调代码的?


by DaShaber @ 2024-08-08 16:01:39

@ImposterAnYu 哥们你定义 dp[N + 5][0] 是干啥(


| 下一页