社区讨论

我是前人(WA On Sub0 #3)

P5621[DBOI2019] 德丽莎世界第一可爱参与者 1已保存回复 0

讨论操作

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

当前回复
0 条
当前快照
1 份
快照标识符
@mk3tw9lr
此快照首次捕获于
2026/01/07 17:41
上个月
此快照最后确认于
2026/01/10 16:30
上个月
查看原帖
首先 CDQ 要去重这个都知道吧。
起因是主包被 Sub0 #3 卡掉了,看到警示后人说还要按可爱值排序,不对啊这东西为什么也要排,反正加了就过了,这我就火大了,非得不排可爱值过一发。
排查之后发现问题其实在去重,主包是这么写的
C
    for (int i = 1; i <= n; i ++) {
        if (a[i].a == a[i - 1].a && a[i].b == a[i - 1].b && a[i].c == a[i - 1].c && a[i].d == a[i - 1].d)
            a[m].v += max(a[i].v, 0ll);
        else {
            a[++ m] = a[i];
            a[m].id = m;
        }
    }
    n = m;
这是最正常的写法,但遇到这组 hack:
CPP
2
0 0 0 0 -2
0 0 0 0 4
就死了,死因是把 v=4v=4 的与 v=2v=-2 的相加了。
当然最简单的做法就是排一遍 vv,但是我们也可以直接忽略所有 v<0v<0 的崩坏兽并特判所有崩坏兽 v<0v<0 的情况,交一发果然过了
MVP 结算画面:
C
    for (int i = 1, now = 0; i <= n; i ++) {
        if (a[i].v < 0)
            continue;
        if (a[i].a == a[now].a && a[i].b == a[now].b
        &&  a[i].c == a[now].c && a[i].d == a[now].d)
            a[m].v += a[i].v;
        else {
            a[++ m] = a[i];
            a[m].id = m, now = i;
        }
    }
    if (m == 0) {
        for (int i = 1; i <= n; i ++)
            ans = max(ans, a[i].v);
        cout << ans;
        return 0;
    }
    n = m;
麻烦了好多。

回复

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

正在加载回复...