2022.04 学习记录
04.01
各种订正。
04.02
各种订正。
「FJOI2021」加法方程 (equa)
每次查询 \(A,B\) 是不变的。由于合法方案字母总数不超过 \(10\),爆搜预处理 \(A,B\) 中每个字母对应的取值,对于没出现过的值新增编号占位,把状态 hash 起来。每次查询算出对应编号查 hash 表即可。这里用自然溢出没有被卡。
「FJOI2021」外星飞碟 (ufo)
\(\{s\}\) 的递推式与 EGF 的卷积相似,考虑从 \(\{a\}\) 与 \(\{s\}\) 的 EGF 入手。
记 \(A(x) = \sum\limits_{i\ge 1}a_i\dfrac{x^i}{i!}\),\(S(x)=\sum\limits_{i\ge 1}s_i\dfrac{x^i}{i!}\)。由 \(\{a\}\) 的递推式可得:
则
由 \(\{s\}\) 的递推式可知:
则
答案即为 \(n![x^n]S(x) = 2n! -n-1\)。
使用 FJOI 必备的 \(O(n)\) 光速阶乘算法即可通过本题。
04.04
「JOISC 2020 Day4」首都
如果两个同色点要在一个连通块内,则其路径上的所有点也需在连通块内。规定连边 \((a,b)\) 表示若 \(a\) 在某一连通块内,则 \(b\) 也必须在其中。对连出的图求强连通分量,则答案就是最小无出度强连通分量的大小。连边的形式是点向路径连边,树剖优化。
04.05
「WC2019」I 君的商店 (shop)
由 \(\text{subtask3}\) 得到启示:如果可以在 \(5n\) 的代价内将序列排序并找到一个 \(1\),则可以用 \(2\log n\) 的代价求出答案——这只需要简单的二分,最后剩下一个元素利用奇偶性判断。
考虑三个元素 \(a,b,c\),不妨设 \(a\le b\)(用 \(2\) 的代价得出),讨论 \(a+b\) 与 \(c\) 的关系:
- \(a+b\le c\),则 \(a=0\),换下一个数作为 \(a\);
- \(a+b\ge c\),则 \(b\ge c\),把 \(c\) 加到一个序列的末尾,令 \(c\gets b\),再换一个数作为 \(b\)。
由此可以得到一些确定为 \(0\) 的数、一个单调不降的序列,以及最后剩下的一个数。而在剩下的数和序列末尾中,必然有一个是 \(1\)。这样就可以二分了。同样利用奇偶性,不难判断出剩下的数和二分剩下的数。
调试问题:二分的写法和边界。
「JOISC 2020 Day2」变色龙之恋
尝试构造图 \(G=(\{1,2,\cdots,2n\},E)\),满足:
- \((x,y)\in E\Longleftrightarrow\operatorname{query}(\{x,y\})=1\)
不难发现满足 \(\operatorname{query}(\{x,y\})=1\) 的二元组 \((x,y)\) 只有三种可能:
- \(x\) 喜欢 \(y\),且 \(y\) 不喜欢 \(x\);
- \(y\) 喜欢 \(x\),且 \(x\) 不喜欢 \(y\);
- \(x,y\) 同色。
那么任意结点在 \(G\) 中的度数只能为 \(1\) 或 \(3\)。对于结点 \(u\),若其度数为 \(1\),则答案已经确定;否则,将与 \(u\) 相邻的三个结点 \(a,b,c\) 拿出来两两与 \(u\) 一起询问,只有 \(\operatorname{query}\{u,和u同色,喜欢u\}=1\),且对于一个结点每条边只会被覆盖一次。因此对每个结点统计一遍,被覆盖超过一次的即为答案。
问题在于如何建出这张图。考虑逐个加入结点 \(u\) 并确定其连出的边。首先 \(G\) 一定是二分图,因此一定可以将其分成两个极大独立集,并且两个独立集分别对应两种性别,这个可以使用带权并查集维护。对两个集合分别考虑(因为性别未知)。若 \(u\) 与集合 \(S\) 中没有边,则 \(\operatorname{query}(S\cup\{x\}) = |S|+1\)。由于最多只有三条边,因此可以分治求出每条边。
查询次数 \(O(n\log n + 3n)\),时间复杂度 \(O(n^2\log n)\)。
「2022-03-22 省选模拟赛」星际广播 (radio)
对三种颜色分别考虑,显然可以 dp。wqs 二分优化。
「2022-03-22 省选模拟赛」星际联邦 (federation)
\(n\) 阶循环矩阵 \(A_{i,j} = w_{i-j}\)(\(0\le i,j\lt n\)) 的行列式,有结论:记 \(F(x) = \sum\limits_{i=0}^{n-1} w_ix^i\),则 \(\operatorname{Det}(A) = \prod\limits_{i=0}^{n-1} F(\omega_{n}^{i})\),其中 \(\omega_n\) 为 \(n\) 次单位根。证明可以将 \(A\) 右乘范德蒙矩阵 \(\{\omega_{n}^{ij}\}\) 后对比两边行列式系数得出。实现时,一次 DFT 即可求出所需的单位根处点值。
对于本题,不难想到加入新结点为根后运用矩阵树定理。构造出基尔霍夫矩阵,发现其为循环矩阵,套用上面的结论即可。
04.06
「2022-04-06 省选模拟赛」方程 (equation)
化一下式子发现只和 \(\dfrac{a+b}{c}\) 有关,转化为统计每种 \(\dfrac{a+b}{c}\) 的数量,循环卷积和求出离散对数后循环卷积即可。
「JOISC 2020 Day4」治疗方案
从左到右考虑所有区间,需要不间断地覆盖。设 \(f_{i}\) 表示考虑前 \(i\) 个区间的最小花费,则 \(f_i\) 可以从满足 \(r_j-l_i+1\ge|t_{j}-t_i|\) 的 \(j\) 处转移过来。这个方程的转移顺序十分不明确,但是可以用类似最短路的方法更新,对绝对值分类讨论,可以把式子拆成与 \(i\) 相关的和与 \(j\) 相关的,线段树优化建图;类似「NOI2019」弹跳的做法,每个区间只会被更新一次,线段树分别维护。
04.07
「2021 集训队互测」整数
先对所有元素操作一遍,得到一个全 \(1\) 序列。按 \(1\sim n\) 依次操作 \(p_i\):
- 若没有产生进位,表现为 \(\operatorname{popcount}\) 恰好加一,无法得出信息;
- 否则,可以通过减少的 \(1\) 的数量知道 \(p_i\) 与上一个进位的位置(特殊地,初始为最高位)间的距离。
重复如上步骤,每轮至少能确定一个数。将排列随机打乱,期望询问次数与随机排列期望最长上升子序列长度同级,故期望询问次数与期望时间复杂度均为 \(O(n\log n)\)。
调试问题:没有注意到每一轮之后,从第 \(n+1\) 位开始逐渐加 \(1\),因此需要特判第一次进位的距离。
CF675E Trains and Statistic
对于每个 \(i\in [1,n)\),其无法直接到达的地方必然选择之后 \(a_j\) 最大的 \(j\) 走。记 \(f_i\) 表示 \([i,n]\) 的答案,从其后的最大值处转移过来。
[HNOI2011] 卡农
见寒假的学习笔记 [HNOI2011] 卡农
04.08
带表妹。
04.09
CF923E Perpetual Subtraction
记 \(f_{i,j}\) 表示第 \(i\) 轮时,\(x\) 为 \(j\) 概率。有转移
记 \(F_k(x) = \sum\limits_{i=0}^{n}f_{k,i}x^i\),则
似乎很难有进一步的推论,但是 \(\dfrac{x^{j+1}}{j+1}\) 很容易让人联想到积分:
积分下限是 \(1\),这很不好处理,尝试把它变成 \(0\)。令 \(G_k(x) = F_{k}(x+1)\):
于是
现在只需要实现 \(\{g_{k}\}\) 与 \(\{f_{k}\}\) 的相互转化。先考虑如何从 \(\{f_{k}\}\) 推到 \(\{g_{k}\}\):
即
将组合数展开后是差卷积的形式。从 \(\{g_{k}\}\) 推回 \(\{f_{k}\}\) 只需要套上二项式反演即可。
[SDOI2011]黑白棋
考虑什么时候先手必胜。由于白色不往左,黑色不往右,于是等价于 \(\dfrac{k}2\) 堆石子,每次可对 \(x\in[1,d]\) 堆石子取走任意数量。这是 nim-k
游戏,先手必胜当且仅当:
- 把石子数量写成二进制数,每位分别相加,若存在一位满足所有石子在这位之和 \(\not\equiv 0\pmod{(d+1)}\)
补集转化,求所有位和都为 \(0\) 的方案数。逐位考虑,设 \(f_{i,j}\) 表示考虑前 \(i\) 位,所有石子和为 \(j\) 的方案数。枚举这一位上有多少石子得到转移。统计答案时,相当于将剩下的石子放到 \(\dfrac{K}2+1\) 个段里,经典插板法。
[SDOI2019]移动金币
和 [SDOI2011]黑白棋
十分类似。这道题相当于阶梯 nim 游戏。记第一个台阶层数为 \(1\),则先手必胜当且仅当
- 用奇数层台阶上的石头做
nim
游戏时先手必胜。
于是变成了 nim-k
游戏的特殊情况,套用 [SDOI2011]黑白棋
的 dp 即可。
[SDOI2019]连续子序列
T.M.序列,在很多地方都有出现,性质非常多,本题只需要用到其中一个。由 T.M.序列
的构造过程,可以把相邻的 \(01\) 缩成 \(0\),相邻的 \(10\) 缩成 \(1\),两个相邻的数相同就寄了。枚举第一个从哪里开始,递归下去做,只会用到 \(O(\log n)\) 个位置。
[ZJOI2016]小星星
子集容斥,求用集合 \(S\) 中编号(可重复使用)的方案数,\(O(n^3)\) 树形 dp。就,过了。
[PKUSC2018]最大前缀和
分别记 \(s_{S},f_{S},g_{S}\) 分别表示集合 \(S\) 中的元素和、考虑 \(S\) 中元素时有多少种排列方式使得最大值为 \(s_{S}\)、考虑 \(S\) 中元素时有多少种排列方式使得所有前缀和 \(\lt 0\)。则答案为 \(\sum\limits_{S\in U} f_{S}\cdot s_{S} \cdot g_{U/S}\)。\(g\) 是容易 dp 的;\(f\) 的转移,考虑在最前面加入一个数。
[PKUSC2018]真实排名
分别考虑每个人的成绩变不变,不变的话不能变的是一段区间,变的话必须变的是一段区间。
04.10
「WC2018」即时战略 (rts)
调了一年。
暴力思路:每次选一个点,从已知连通块不断拓展直到拓展到为止。直接上点分树,每轮最多拓展 \(O(dep)\) 个点,每轮拓展完类似替罪羊重构。总操作次数 \(O(n\log n)\)。
链要特别搞一下。
调试问题:重构点分树时,可以用深度判断是否在子树内。
「WC2019」远古计算机 (oldcomputer)
大玄学。
\(\text{subtask1,3}\):读懂题。
\(\text{subtask2}\):有点意思。把斐波那契数列打表出来,jmp
跳到对应行。
\(\text{subtask4}\):事实上每个点的第二个寄存器是寄的,主要受到线路的制约。对 \(1\sim 50\) 处理处一条到 \(51\sim 100\) 任意结点的最短路,按到达的时间顺序输出,经过一些玄学调整可以通过。
\(\text{subtask5}\):对每个结点记录其在某个时间结点是否被占用,依次跑最短路,按到达的时间顺序输出,经过一些玄学调整可以通过。
注意审题:多次调用一台计算机会寄。
[HAOI2017]方案数
经典模型的稍加改动,和那个网格图上障碍点的题十分相似。发现方案数只和 \(\operatorname{popcount}\) 的差有关,预处理每种差的方案数后,容斥 dp 即可。
[WC2020] 猜数游戏
考虑一个元素 \(x\) 能对哪些集合贡献。这需要满足 \(x\) 在集合中,且集合中没有能表示出 \(x\) 的元素。如果能求出元素间的表示关系,计算答案是容易的。分类讨论:
-
\((a_i,p) \gt 1\),则 \(a_i\) 只能表示出 \(O(\log p)\) 个数,暴力预处理;
-
\((a_i,p)=1\),考虑 \(a_i\) 关于 \(p\) 的阶 \(\operatorname{ord}_p(a_i)\)。
引理:\(x\) 能表示 \(y\),当且仅当 \(\operatorname{ord}_p(y)|\operatorname{ord}_p(x)\)。
结合下文阶的性质 1,2 不难证明其充要性。由此可以把所有元素按阶分类,暴力枚举两数。
简要记一下阶:
对于满足 \((x,p)=1\) 的正整数 \(x,p\),\(\operatorname{ord}_p(x)\) 定义为最小的 \(m\) 满足 \(x^m\equiv 1\pmod{p}\),那么显然有 \(\operatorname{ord}_p(x) | \varphi(p)\)。特殊地,当 \(\operatorname{ord}_p(x) = \varphi(p)\) 时,称 \(x\) 为 \(p\) 的原根。求阶可以求出 \(\varphi(p)\) 后用因数试除。
- \(a\equiv b\pmod{p} \Longleftrightarrow \operatorname{ord}_p(a)=\operatorname{ord}_p(b)\)
- \(\operatorname{ord}_p(x^k) = \dfrac{\operatorname{ord}_p(x)}{(\operatorname{ord}_p(x),k)}\)
- 当且仅当 \((\operatorname{ord}_p(a),\operatorname{ord}_p(b))=1\) 时,\(\operatorname{ord}_p(ab) = \operatorname{ord}_p(a)\operatorname{ord}_p(b)\)
04.11
[HNOI2016]最小公倍数
Powerful Number 图。
本质是求两点是否存在两种最大值恰好为查询的数对的路径。我们希望在只加入两种权值都 \(\le\) 该询问权值的情况下统计答案,这样就只需求最大值。离线,对边按 \(a\) 排序后分块,对询问按 \(b\) 排序。每块考虑 \(a\) 在当前块范围内的询问。前面的块按 \(b\) 排序,每次能产生贡献的是一段前缀,单指针维护;当前块内暴力加入,可撤销并查集维护。
调试问题:块边界没处理好。
[HAOI2018]反色游戏
当且仅当每个连通块中都不存在奇数个黑点时有解。
记连通块个数为 \(k\),则初始答案为 \(2^{m-n+k}\)。维护点度数和全局奇黑连通块个数,考虑删去点 \(u\) 有什么影响:
- \(u\) 为割点,则会把一个连通块拆成若干连通块,需要预处理拆完后是否存在奇数个点的黑色连通块;
- 否则,只需考虑其对所在连通块黑点个数的影响。
特殊考虑没连出边的点,对答案没有影响。
调试问题:连通块根节点的割点数量求错。
「2022-02-05 厦门双十联考」区域划分 (divide)
有一些显而易见的无解情况:
- 相邻结点颜色相同;
- 有一种颜色没出现过。
但是找不出进一步的结论,于是大胆猜想剩下情况一定有解并通过构造证明。考虑增量构造,每一条边便增加一个三角形,为此需要维护满足左右相邻点和本结点都异色的结点集合,并支持删除一个结点,使用链表维护。但是这样有一个问题,在某种颜色 \(c\) 只剩下一个点时,这个算法可能将 \(c\) 色点直接删去导致剩下结点无法构造答案,此时特判即可完成构造。
「2021-02-28 联考」询问 (query)
把所有询问离线,每个 \(k\) 单独做。求出每个元素作为第 \(k\) 大值的所有区间(显然总数 \(O(nk)\))后,相当于矩形加单点查。预处理区间可以排序之后使用链表,从小到大考虑完就删去。
「PR #1」删数
差分数组 \(\{d\}\),则每次操作相当于把相邻相同的数删掉一个并把剩下一个 \(\times 2\)。把所有数按照正负和 \(\dfrac{d_i}{\operatorname{lowbit}(d_i)}\) 分段考虑,显然只有同一段的元素能够缩起来。对于同一段内的元素,我们就只需要考虑 \(\log_2 \operatorname{lowbit}(d_i)\),那么合并两个数就相当于把两个数删去一个并把剩下一个 \(+1\),这样就和 [USACO16OPEN]262144 P
一样了,类似倍增维护出合并出 \(j\) 时所在的位置,多加一个统计答案的 dp 即可。
调试问题:分段边界没清空。
04.12
[HAOI2018]奇怪的背包
拓展一下二元一次不定方程的结论
\(n\) 元一次不定方程 \(\sum\limits_{i=1}^n a_ix_i = b\) 有解,当且仅当 \((a_1,a_2,\cdots, a_n) | b\)
那么记 \(f_i\) 表示 \(\gcd() = i\) 的集合数量,每次询问的答案即为 \(\sum \limits _{d| w_i}f_d\)。\(f\) 背包一下就好了。
[HAOI2018]字串覆盖
数据范围明示数据分治。
-
\(r-l \gt 50\):后缀树上定位到对应结点 SAM 线段树合并二分求出区间中最前的结点,暴力求下一个区间在哪里。\(r-l\in [50,2000]\) 的询问次数不多,暴力跳的总次数不多。
-
\(r-l \le 50\):对每种长度分别考虑,倍增预处理跳了 \(2^j\) 个串后到达的位置及对应左端点下标和。
04.14
学习 PGF,见学习笔记。
[PKUSC2018]星际穿越
从 \(u\) 出发,第一次跳跃能走到 \([l_u,x]\) 的点,其中 \(x\) 是最大的能走到 \(u\) 的点;从第二次跳跃开始,行动轨迹变得有迹可循:记上一次跳跃能到达的左端点为 \(p\),每次能够跳到 \(\min\limits_{i=p}^{x}l_i\) 处。这启发我们倍增预处理跳 \(2^j\) 步后到达的点,顺便维护跳 \(2^j\) 步代价之和。查询时特判第一步和最后没法跳满的部分。
04.15
「2020-04-21 省选模拟赛」探险队 (expedition)
对反图建以 \(T\) 为根的最短路径树,则被删去的边一定在 \(S\) 的祖先链上。对于一条非树边 \((u,v,w)\),其能对 \(\operatorname{LCA}(u,v)\) 以下的所有结点 \(x\) 提供一条从绕开其父边的路径,总代价为 \(dis_u - dis_x + dis_v + w\)。可以从下往上跳,堆维护每条可行路径,但由于理解错题意对着堆调了一个上午导致我不想再碰它;题解给出了一个比较难想到的做法:记 \(f_u\) 表示从 \(u\) 出发的答案,\(g_u\) 表示发现有边被删后的最优策略下的路径长度,则 \(f_{u} \gets \max (g_u, f_v+w_{u,v})\),转移顺序不明确,最短路优化。
调试问题:对题意给出了错误的理解。
「2020-04-03 省选模拟赛」玩具 (toy)
记会随时间增加边权的边为特殊边,则随着 \(x\) 增大,所用的特殊边数量是单调的,且对于使用同样数量特殊边的方案,其所用边集必然相同。于是把询问离线之后整体二分,费用流记录用了几条特殊边即可。
04.17
「JOISC 2020 Day2」遗迹 3
考虑如何从 \(h\) 得到 \(A\)。从后往前,对于柱子 \(i\),若 \(h_i\) 在后面的最终高度没出现过,则会保留;否则会一直减到在后面的最终高度没出现为止。
即 \(i\) 的最终高度等于 小于 \(i\) 的初始高度的值中最大的 没在 \([i+1,2n]\) 的最终高度种出现过的值。
不妨先暴力一点,状压后缀没出现过的最终高度的集合。设 \(f_{i,S}\) 表示从后往前考虑到第 \(i\) 个位置,\(S\) 中的高度没在最终高度中出现过。由于我们并不知道每种初始高度出现过多少次,在这里认为高度相同的两个石柱本质不同,最后除掉 \(2^n\)。转移讨论是否被保留:
-
未被保留,记 \(S\) 中极长前缀 \(0\) 长度为 \(j\),\([i+1,2n]\) 中未被选择的位置个数为 \(c\),则这个位置必须填一个 \([1,j]\) 中的数。那么总共有 \(2j\) 个数可供选择,其中已被选择的高度有 \(j+c\) 个(每个被保留的位置恰有一种高度,每个未保留位置的高度也在 \([1,j]\) 中),则转移系数为 \(j-c\);
-
被保留,枚举该位置的最终高度 \(k\),我们需要保证填入的初始高度能被减到 \(k\)。记 \(S\) 中 \(k\) 后的极长连续 \(0\) 长度为 \(d\),则转移系数为 \(d+2\)(初始高度为 \(k\) 有两种,初始高度 \(\gt k\) 有 \(d\) 种)。
现在需要优化状态。注意到极长前缀 \(0\) 的长度非常关键,设 \(f_{i,j}\) 表示从后往前考虑到第 \(i\) 个数,最终高度的前缀极长连续段为 \(1\sim j\)。转移依然讨论是否保留。未被保留的情况是简单的,转移需要的信息记在状态里,直接转移即可;但对于被保留的情况,此时我们并不知道 \(k\) 后极长连续 \(0\) 的长度,需要稍作调整。
我们只关心极长前缀连续 \(0\) 的长度,因此如果新加入的最终高度 \(\gt j+1\),我们可以先放着不管,而是在之后某一次加入使得中间都连上时一起加入并统计贡献。说人话,每次转移加入一段连续的数 \([j+1,j+k]\),比较类似贡献推迟计算的 trick。这样每次考虑的最终高度都是一段前缀。讨论:
-
加入的数不连续。由于推后计算,直接令 \(f_{i,j} \gets f_{i+1,j}\);
-
加入一段连续的数。枚举加入数的个数 \(k\),即从 \(f_{i+1,j}\to f_{i,j+k}\)。注意我们钦定了这个位置上的最终高度为 \(j+1\)。则 \(i\) 上可以选择 \(k+1\) 个数(考虑方式与状压时相同)。记 \(e\) 为 \([i+1,2n]\) 中保留的位置个数,则在这些位置中还需包含 \([j+2,j+k]\) 的元素,方案数为 \(\dbinom{e-j}{k-1}\)。但此时我们并没有确定初始高度的方案数,这似乎不好快速计算。这些数的初始高度显然在 \([j+2,j+k]\) 这个长度为 \(k-1\) 的区间中,这就意味着这个方案数与 \(j\) 没有关系,不妨先记作 \(t_{k-1}\)。于是得到转移 \(f_{i,j+k}\gets f_{i+1,j}(k+1)\dbinom{e-j}{k-1}t_{k-1}\)。
遗留的问题是 \(t_i\) 的计算。明确一下 \(t_i\) 的定义:填入 \(i\) 个在 \([1,i]\) 中的数使得最终高度恰为 \(1\sim i\) 的排列。称满足这一条件的填入方案合法,则一种填入方案合法当且仅当对 \(\forall 1\le k\le i\),填入的数中 \(\le k\) 的数不超过 \(k\) 个。
再做一个 dp,记 \(g_{i,j}\) 表示考虑 \(i\) 种初始高度,填入 \(j\) 个位置的方案数,则 \(t_{i} = g_{i,i}\)。转移考虑新加一种初始高度,枚举填了多少个(\(0\sim 2\)):\(g_{i,j} = g_{i-1,j} + g_{i-1,j-1}\cdot 2j + g_{i-1,j-2}\cdot j(j-1)\)。只需保证 \(j\le i\) 即可满足合法性。
时间复杂度 \(O(n^3)\)。
04.18
「JOISC 2020 Day2」有趣的 Joitter 交友
双向边连接形成的连通块会被缩成团,直接维护这个团。需要维护的信息有:团中元素的集合 \(E\)、连向该团的团的集合 \(A\)、该团连向的团的集合 \(B\)、连向该团的点集 \(C\),则一个团的贡献为 \(|E|(|E|-1) + |E||C|\)。连边时启发式合并缩团,可能产生连锁反应,类似 bfs 队列维护。
调试问题:写了假的启发式合并,遍历了大的集合。
「NOI2019」回家路线
式子看着就很斜优。对每个地点维护斜率单调队列,按时间枚举事件(到达、出发),到达时尝试加入队列,出发时转移。
04.19
「NOI2019」I 君的探险
暴力
枚举每个点操作,若操作后某个点状态改变则有连边。
树(\(x\lt y\))
二分父亲的位置,整体二分。
树(一般情况)
考虑每次删去叶子。令标号变为 \([1,n]\)。对每个 \(k\),把二进制下第 \(k\) 位为 \(1\) 的拿出来,记录状态改变的点,则可得到所有相邻点编号的异或和 \(s_x\)。那么对于叶子,则有 \(s_x=x\)。并且可以通过 \(O(1)\) 次操作判断两点间是否有边,依此逐步迭代。
一般情况
对每个点以 \(\dfrac{1}{2}\) 的概率随机修改,记修改的集合为 \(S\),状态改变的点集为 \(T\),则 \(T\) 中结点与 \(S\) 中结点定有连边。分治,每次随机修改,划分集合。使用 check
减少孤立点个数以剪枝。
与非 (nand)
与非可以表示出所有基本位运算。因此直观来看可以表示的数很多。考虑二进制下两位 \(i,j\),若对所有数 \(k\) 都有 \(a_{k,i}=a_{k,j}\),则结果中这两位一定相同,否则互不影响。并查集维护出相同的集合。按照套路,统计答案时从高到低枚举相同的位数。
CF212A Privatization
CF1147F Zigzag Game
04.20
vp 联合省选 Day1,打得比较保守,T2 T3 只写了暴力。
「ExPR #1」乘积(ABC239 Task Ex (Dice Product 2))
\(f_i\) 表示 \(m=i\) 时的期望,则 \(f_n = 1+\sum\limits_{i=1}^{n}f_{\lfloor\frac{n}i\rfloor}\)。移项后类似杜教筛递归计算即可。
[ZJOI2019]开关
按 \(k\) 次开关得到目标状态和回到原状态的 EGF 分别为
但我们想要的是期望,也即概率生成函数(OGF)的导数。设 \(f(x),g(x)\) 分别为 \(F(x),G(x)\) 转为 OGF,则所求即为 \(h^{\prime}(1) = (\dfrac{f}{g})^{\prime}(1)\)。
将 \(F(x)\) 写成 \(\sum c_i e^{ix}\) 的形式,则有 \(f(x) = \sum \dfrac{c_i}{1-ix}\),同理设 \(g(x) = \sum\dfrac{d_i}{1-ix}\),其中 \(c_i,d_i\) 均可背包求出。
那么 \(h^{\prime} = (\dfrac{f}{g})^{\prime} = \dfrac{f^{\prime} g-g^{\prime} f}{g^2}\),但直接带入 \(x=1\) 会有收敛性的问题。分子分母同乘 \(1-x\),即令 \(f(x)\gets f(x)(x-1) = c_1 + \sum\limits_{i\ne 1}\dfrac{c_i(1-x)}{1-ix}\),\(g\) 同理,则 \(f(1)=c_1\),\(g(1) = d_1\),答案即为
上述讨论在 \(p_i\gets \dfrac{p_i}{\sum p_i}\) 时进行,实现上不能先进行,需要稍加修改。
[PKUSC2018]神仙的游戏
转化成周期之后,等价于判断是否存在两个不同字符距离为 \(k\) 的倍数。翻转数组后 NTT 求出所有距离即可。
04.21
vp 联合省选 Day2,不知道为什么 T1 做了很久。最后挂了。注意模数。
[PKUSC2018]主斗地
大搜索。没有 \(3\) 状态数不多。然后搜用了多少三带四带,贪心打剩下的牌。
CF1408E Avoid Rainbow Cycles
把集合建点,若数 \(x\) 存在于集合 \(y\) 中则 \(x,y\) 连边。则题中彩虹环对应新图上的环,求最大生成树。
「2022-02-04 省选模拟赛」游戏
「2022-02-06 省选模拟赛」A
CF762F Tree nesting
04.22
「WC2018」通道 (tunnel)
第一棵树边分治,第二棵树上建虚树,dp 剩下权值的最大值。具体地,类似树上直径的结论,每个点的最优决策点必定为两端点,且可以合并。转移直接枚举合并方式。
也可以点分治,每次选两个大小最小的子树合并。
CF868E Policeman and a Tree
[BalticOI 2021 Day2] The short shank
考虑能传染到每个点的第一个点 \(p_i\),则对于两个本不会造反的点 \(i,j\),\([p_i,i]\) 与 \([p_j,j]\) 包含或不交。对每个点 \(v\),找到最小的包含它的点 \(u\) 连边,形成一棵树。则阻断一个点相当于减去树上一条到根的路径。即选 \(D\) 条路径使权值和最大。长剖。
CF526G Spiders Evil Plan
\(y\) 条路径等价于 \(2y\) 条从叶子到根的路径。显然要以直径两端点为根。长剖,处理每条长链的优先级。为了把 \(x\) 加入连通块,有两种决策:
- 删去最短的长链,连上 \(x\);
- 删去 \(x\) 往上跳到的第一条长链,把那条长链改成连向 \(x\)。
倍增优化。
「NOI2018」冒泡排序
好排列等价于不存在长度超过 \(2\) 的下降子序列,我只有一个非常不严谨的感性证明。先不考虑字典序的限制,总方案数怎么求。设 \(f_{i,j}\) 表示填了 \(i\) 个数,最大值为 \(j\) 的方案数。转移考虑末尾新加一个数 \(x\):
- \(x\lt j\),则 \(x\) 必须是未出现过的数中最小的;
- \(x\gt j\),随意;
于是 \(f_{i,j} \to f_{i+1,k}\)(\(k\ge j\)),即 \(f_{i,j} = \sum\limits_{k=1}^{j}f_{i-1,k} = f_{i-1,j} + f_{i,j-1}\),转化为网格图上走路,注意到 \(i\le j\),于是 \(f_{n,n} = Cat(n)\)。
对于字典序的限制,枚举前 \(i-1\) 位相同,第 \(i\) 位大于。记 \(m = \max(前缀最大值,a_i)\),则相当于从 \((n-i+1, n-m-1)\) 走到 \((n,n)\),依然搬上卡特兰数即可 \(O(1)\) 计算。
04.23
LOJ #6274. 数字
先考虑判断能否存在 \(x\operatorname{or}y =T\),\(x\operatorname{and}y =S\)。设 \(f_{i,lx,rx,ly,ry}\) 表示从高到低考虑到第 \(i\) 位,是否大于 \(Lx\),是否小于 \(Rx\),是否大于 \(Ly\),是否小于 \(Ry\)。把这个 dp 数组压成状态,\(g_{i,S}\) 表示从高到低考虑到第 \(i\) 位,\(f\) 状态(合法性)为 \(S\) 的方案数。枚举当前位填什么转移。状态数 \(2^{16}\times 60\)。
LOJ #6497. 「雅礼集训 2018 Day1」图
设 \(f_{i,j,k,l}\) 表示前 \(i\) 个点,路径长度奇偶性为 \(j\),奇黑个数、奇白个数。设加入一个新白点,黑点同理:
-
\(k=0\),则随意连边,\(f_{i+1,j\oplus 1,k,1}\gets 2^i\cdot f_{i,j,k,l}\);
-
\(k\gt 0\),可以选择钦定/不钦定一个奇黑向其连边,于是新点作为奇偶的方案数应该是相等的。
注意到我们只关心是否存在奇黑、奇白,后两维只需记 \(0/1\)。
据此转移即可。