[数形结合] UVa1451 Averange 平均值 (前缀和+斜率优化)(单调栈)

题目

这里写图片描述

思路

这里写图片描述
这里写图片描述
这里写图片描述

代码

#include <cstdio>
#include <cstdlib>

const int maxn = 100000 + 1000;
int num[maxn], sum[maxn], n, L, p[maxn];
char s[maxn];

// 有效避免除法
int cmp(int x1, int x2, int x3, int x4) {
    return (sum[x2] - sum[x1 - 1]) * (x4 - x3 + 1) - (sum[x4] - sum[x3 - 1]) * (x2 - x1 + 1);
}

int main() {
    int T;
    scanf("%d", &T);
    while (T--) {
        scanf("%d%d%s", &n, &L, s + 1);
        for (int i = 1; i <= n; i++) num[i] = s[i] - '0';
        sum[0] = 0;
        for (int i = 1; i <= n; i++) sum[i] = sum[i - 1] + num[i];

        int ansL = 1, ansR = L, i = 0, j = 0;
        for (int t = L; t <= n; t++) {
            while (i < j - 1 && cmp(p[j - 2], p[j - 1], p[j - 1], t - L) > 0) j--;
            p[j++] = t - L + 1;
            while (i < j - 1 && cmp(p[i + 1], t, p[i], t) >= 0) i++;
            int c = cmp(p[i], t, ansL, ansR);
            if (c > 0 || (c == 0 && t - p[i] < ansR - ansL)) {
                ansL = p[i];
                ansR = t;
            }
        }

        printf("%d %d\n", ansL, ansR);
    }
    return 0;
}

感悟

1.此题虐我千百遍,我仍待此题如初恋。。
2.折磨了我将近半个月,思路那是相当清晰,但就是调不出来,跟udebug上数据一对比,总有各种各样的错误,干脆拿来LRJ的算了。自我感觉这道题理解地够清晰了。
3.也算烂尾吧。。比较有关形的题基本没做过,一上来就做这种难度的,调不出来也是没办法。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值