为了满足题目条件,我们可以做差分
把差分后的序列当作石子堆,这样原序列中拿走一颗石子相当于差分序列里把一颗石子推到后面一堆去
那么就是阶梯博弈了
(阶梯博弈就是谁先把石子全部推下去谁赢)
阶梯博弈的策略是:
所以阶梯博弈实际上就是奇数堆的 Nim
如果 s 是 ∞+ 的话,这题可以考虑贪心的做法
然而既然有 s 这个限制,那么可以口胡想象到的是(简单的)贪心可能会出锅。。。
(窝当然不会证明啦)
那么 DP 严肃地贪心一下好了
(以下 DP 贪心方式来自学长博客)
对每个点记录两个值:
转移好说,见代码
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;
}
}
}
这里贪心地只分配两层
(至于为什么我真的不知道)
神题,真•神题
这题竟然可以直接暴力过 23333
(当然正解我也看不懂是吧)
没权限号,暂时没看
大数据结构题,也不会
很简单的一道 DP 题,想复杂了。。。
暴力 \( O(n^2) \) 就可以了
据说是码农题?
反正我 YY 了一下分几种情况,大概是吧
(反正逻辑对了就是过了)
完全没往二分图上想啊 QWQ
(学长有份非常详细的解答)
直接套用 Hall 定理就好了
把每个鞋子的人依次排开,把每双鞋子也依次排开,然后连边
首先可以确定的是,我们不可能一个一个集合来检查是否满足条件
但是显然可以把相同鞋子的人当作一个整体来考虑
进一步,可以把条件弱化成对每个连续区间满足 ∣W∣≤∣NG(W)∣
也即是说,对尺码区间 \( [l, r] \),满足 \( {\displaystyle \sum_{i=l}^{i=r} a_i} \le K \times (r + d - l + 1) \)
化简即得 \( {\displaystyle \sum a_i - K} \le K \times d \)
神奇的交互题,无脑 CE
弃疗
很简单的半平面交啊
注意点 1 和点 n 是相邻的
并且可以在线段交点处转弯
而且要路径尽量平
那么直接半平面交一条路径从 1 到 n 就好了
原来相邻的条件完全没用啊!
(也许是我太菜了)
DP 方程妙极了
令 f[i][j] 表示 i 点到 j 点的最短长度
转移需要枚举两端,找到匹配的字符
复杂度 \( O(n^4 )\)
那么再设 g[i][j][k] 表示从 i 到 j 除了最后一截是 c 以外其它都是回文路径的最短长度
就可以开开心心的转移啦
普及状压 DP
神仙题
没读懂题目意思,弃疗
记得之前翻过 vfk 的博客,有这么一篇题解
做点整理吧:
关于 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)
引理:任何的 k 不属于 {1, 3},那么 H(k)+0 不会是任何 H(m) 的后缀
水题
Gas 的贪心是很神奇的
Prz 的暴力是最厉害的
Lyz 的证明看得美滋滋
Wsp 调了一下午 QWQ
Baj 的 DP 也起来很爽
Slw 的结论看起来好玄
总之这一年的 POI 做起来很爽就是了