近期总结 2024.2.20
AGC050C Block Game
题意:一个由 B,S 组成的字符串 \(s\),你和对手在一个无限长的一维网格图进行游戏,对手一开始在其中一个格子。游戏第 \(i\) 轮:
-
若 \(s_i\) 为 B,你在网格图上的一个没有障碍以及非对手所在格子的格子上放一个障碍。若此时对手左右相邻两个格子上都有障碍,你胜利并结束游戏。
-
若 \(s_i\) 为 S,对手可以移到左右相邻两个格子的一个,满足没有障碍,也可以不移动。
\(n\) 轮后若游戏没有结束,对手胜利。
现在 \(s\) 种有一些未知字符,求多少种可能的 \(s\) 可以使得你胜利。 \(1\le n\le 10^6\)
第一个 B 出现后,对手一定会一直向和 B 相反的方向移动。
第二个 B 出现后,两个 B 形成一个区间,对手一定会尽可能往区间中间移动。
此时有两种情况:要么移到了中间,要么没移到。
考虑 dp,区间长度每次至少缩到原来的一半。
发现很难。
尝试把过程倒着来,倒数第 \(i\) 个区间长度至少是 \(2^i\),直接 dp,时间 \(O(n\log n)\)。
AGC023D Go Home
题意:一个数轴,有若干人从 \(S\) 点上车回家,一共 \(n\) 个房子,其中前往位置为 \(p_i\) 的房子的有 \(a_i\) 人。每次车上的人会进行投票决定当前车向左/右走,如果票数相同则往左走。每个人都绝顶聪明,都会以使自己尽可能早回到家的最优决策投票,当车到达一个人的家位置后他可以不费时间立刻下车回家,求最后一个人的回家时间。 \(1\le n\le 10^5\)
正着博弈论?
倒着来!
把房子按位置排序,考虑最后一个人回家是 \(1\) 还是 \(n\)。
我们尝试只比较 \(a_1\) 和 \(a_n\) 大小来确定最后一个是 \(1\) 还是 \(n\)。容易证明,考虑如果 \(n\) 回了家并且 \(2\) 还没回家,那么 \(a_n\) 仍然比 \(a_1\) 大。
如果 \(1\) 确定了最后一个回家,那么他一定会大力帮助 \(n\) 回家,即一直投票向右走直到 \(n\) 回家,相当于 \(n\) 获得了 \(a_1\) 票:\(a_n\gets a_n+a_1\)。
发现一直做下去知道 \(S\) 一边为空即可,\(O(n\log n)\)。
Luogu3824 泳池
题意:一个长为 \(n\),无限宽的网格图,每个格子有 \(p\) 概率染白,有 \(1-p\) 概率染黑。选择一个下边界紧贴网格图下边界的矩形,求选出矩形最大面积为 \(k\) 的方案数,答案模 \(998244353\)。\(1\le n\le 10^9,\space 1\le k\le 1000\)
注意恰好,考虑用 \(\le k\) 的减去 \(\le k-1\) 的。
一个暴力的 dp 是设 \(f[i,j]\) 表示已知前 \(i\) 行都是白色,且当前长度为 \(j\) 的考虑了剩余部分的合法概率。然后类似于笛卡尔树转移。
注意到 \(i\cdot j\le k\)。当 \(i>0\) 时有 \(j\le k\),说明我们 dp 的矩形长度一般情况下不超过 \(k\),只有当 \(i=0\) 即我们从第一行开始确定时 \(j\) 有可能超过 \(k\)。
把这个东西分开。设 \(f[i]\) 表示前 \(i\) 列,且第 \(i\) 列第一行的格子是黑色的合法概率,\(\frac{f[n+1]}{1-p}\) 即为所求。
设 \(g[i,j]\) 表示不需要考虑前 \(i-1\) 行且前 \(i\) 行都是白色,合法的概率。
先求 \(g\):
-
第 \(i+1\) 行没有黑格子:\(g[i,j]\gets g[i+1,j]\times 2^j\)
-
第一个黑格子在第 \(x\) 个位置:\(g[i,j]\gets g[i+1,x-1]\times g[i,j-x]\times p^x\times (1-p)\)
由于 \(i\cdot j\le k\),状态数为 \(O(k\log k)\),时间 \(O(k^2\log k)\)。
接下来求 \(f\),钦定第 \(0\) 列为黑色,显然有
这是常系数齐次线性递推的形式。
先 dp 出前 \(k\) 项,然后直接多项式快速幂 + 取模即可。由于 \(k\le 1000\),直接暴力多项式操作就行。
时间复杂度 \(O(k^2(\log k+\log n))\)。