POI2009 题解

Posted hailjedi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了POI2009 题解相关的知识,希望对你有一定的参考价值。

POI2009 完结撒花!技术分享图片

Kam

为了满足题目条件,我们可以做差分

把差分后的序列当作石子堆,这样原序列中拿走一颗石子相当于差分序列里把一颗石子推到后面一堆去

那么就是阶梯博弈了

(阶梯博弈就是谁先把石子全部推下去谁赢)

阶梯博弈的策略是:

  1. 先手若把偶数堆的石子推到奇数堆,后手就把这些石子推到下一个偶数堆(这样奇数堆状态不会变)
  2. 先手若把奇数堆的石子推到偶数堆,这时根据 SG 函数来做奇数堆的 Nim 博弈

所以阶梯博弈实际上就是奇数堆的 Nim

Gas

如果 s 是 ∞+ 的话,这题可以考虑贪心的做法

然而既然有 s 这个限制,那么可以口胡想象到的是(简单的)贪心可能会出锅。。。

(窝当然不会证明啦)

那么 DP 严肃地贪心一下好了

(以下 DP 贪心方式来自学长博客

对每个点记录两个值:

  1. coverd,表示这个点的距离为 d 的祖先及其兄弟们有多少个被覆盖(??)
  2. needd,表示这个点的子树下距离为 d 的点有几个需要被覆盖(??)

转移好说,见代码

need[u][i] += need[v][i-1]; // v 是儿子节点
cover[u][i-1] += cover[v][i]; // 这里向上计录

这里定义 urg = need[u][k] - cover[u][k]

正常情况下,urg ≤ 0,此时仍能够把向上覆盖的配额分配到下面去

如果 urg > 0,就不得不需要重新建立消防站,同时更新向上的覆盖

if (urg > 0) {
    ll cov = (urg + s - 1) / s;
    cover[u][k] += cov * s;
    ans += cov;
}

(突然发现 urg = need[u][k],呵呵)

最后考虑将向上的配额送下去

for (int i = 0; i <= k; i++) {
    for (int j = i; j >= 0 && (ok || j >= i-1); j--) {
        ll elim = min(cover[u][i], need[u][j]);
        cover[u][i] -= elim;
        need[u][j] -= elim;
        if (!cover[u][i]) {
            break;
        }
    }
}

这里贪心地只分配两层

(至于为什么我真的不知道)

Prz

神题,真•神题

这题竟然可以直接暴力过 23333

(当然正解我也看不懂是吧)

SLO

没权限号,暂时没看

STR

大数据结构题,也不会

Kon

很简单的一道 DP 题,想复杂了。。。

暴力 ( O(n^2) ) 就可以了

Wys

据说是码农题?

反正我 YY 了一下分几种情况,大概是吧

(反正逻辑对了就是过了)

Lyz

完全没往二分图上想啊 QWQ

(学长有份非常详细的解答

直接套用 Hall 定理就好了

把每个鞋子的人依次排开,把每双鞋子也依次排开,然后连边

首先可以确定的是,我们不可能一个一个集合来检查是否满足条件

但是显然可以把相同鞋子的人当作一个整体来考虑

进一步,可以把条件弱化成对每个连续区间满足 ∣W∣≤∣NG(W)∣

也即是说,对尺码区间 ( [l, r] ),满足 ( {displaystyle sum_{i=l}^{i=r} a_i} le K imes (r + d - l + 1) )

化简即得 ( {displaystyle sum a_i - K} le K imes d )

(但是总感觉这样是不必要的)

(懒得证明了)

Arc

神奇的交互题,无脑 CE

弃疗

Wsp

很简单的半平面交啊

注意点 1 和点 n 是相邻的

并且可以在线段交点处转弯

而且要路径尽量平

那么直接半平面交一条路径从 1 到 n 就好了

Baj

原来相邻的条件完全没用啊!

(也许是我太菜了)

DP 方程妙极了

令 f[i][j] 表示 i 点到 j 点的最短长度

转移需要枚举两端,找到匹配的字符

复杂度 ( O(n^4 ))

那么再设 g[i][j][k] 表示从 i 到 j 除了最后一截是 c 以外其它都是回文路径的最短长度

就可以开开心心的转移啦

Wie

普及状压 DP

KOD

神仙题

没读懂题目意思,弃疗

Slw

记得之前翻过 vfk 的博客,有这么一篇题解

做点整理吧:

  1. 关于 H(k-1) 到 H(k) 的变换的一些性质:

    把 H(k) 变到 H(k-1) 的方法是,如果有个 1 后面有个 0,就把 10 变为 1 —— 不然,就把 1 变成 0。于是得到下面的特性:

    (a) H(k) 以 1 开始(当 k >= 1)

    (b) 如果 k 是偶数,那么 H(k) 以 0 结尾;如果 k 是奇数,那么 H(k) 以 1 结尾

    (c) H(k) 没有子串 00

    (d) H(k) 没有子串 111(因为 H(k-1) 具有性质 c)

    (e) H(k) 没有子串 101010(因为 H(k-1) 具有性质 d)

  2. 引理:任何的 k 不属于 {1, 3},那么 H(k)+0 不会是任何 H(m) 的后缀

Tab

水题

小结

Gas 的贪心是很神奇的

Prz 的暴力是最厉害的

Lyz 的证明看得美滋滋

Wsp 调了一下午 QWQ

Baj 的 DP 也起来很爽

Slw 的结论看起来好玄

总之这一年的 POI 做起来很爽就是了

以上是关于POI2009 题解的主要内容,如果未能解决你的问题,请参考以下文章

题解-POI2009 WSP-Island

题解 bzoj1135: [POI2009]Lyz (线段树+霍尔定理)

题解Luogu P3488 [POI2009]LYZ-Ice Skates

[POI2009]KON-Ticket Inspector(二维前缀和+DP)

BZOJ 1115 [POI2009]石子游戏Kam(阶梯博弈)

P3486 [POI2009]KON-Ticket Inspector