2024 年四月做题记录
穿梭于樱花树海之下,徜徉于生与死的结界之上,离究极之真实越来越近。
CF1942F
结论 1:在运算过程中全部都做向下取整对答案没有影响。
然后就可以分块了。对于大小为 \(B\) 的块,块首改变一个数对最后的答案最多改变 \(1\)。
当然也可以线段树。
CF1942G
首先注意到,\(+1\) Card 毫无用处。
枚举 \(i\) 使得取 Card 的过程在 \(i\) 终止了。
视 \(+2\) 为 \(+1\),\(+0\) 和特殊卡为 \(-1\),初值为 \(5\)。
则如果过程在 \(i\) 处终止,那么 \(\left(\sum v_i\right) + 5 = 0\)
据此,可以解出 \(c_0, c_2\)。
那么,答案就相当于从 \((0, 5)\) 走到 \((c_0, c_2 + 5)\) 的方案数,且不能经过直线 \(y=x\)。
使用反射容斥。答案相当于 \(f(0, 5, c_0 - 1, c_2 + 5) - f(0, 5, c_0, c_2 + 4)\)。
\(f((x_1, y_1), (x_2, y_2))\) 表示从 \((x_1, y_1)\) 走到 \((x_2, y_2)\) 的方案数。
21633. 【PER #2】 2048
考虑把一个数形成的过程(即,不断合并)压成一步。
设 \(f_{i, j}\) 表示长度为 \(i\) 的数组得到 \(2^j\) 的贡献的期望,\(g_{i, j}\) 表示概率。
这个可以简单 dp。
下一步,设 \(h_{i, j}\) 表示填到第 \(i\) 位,第 \(i\) 位是 \(2^j\) 的概率,\(H_{i, j}\) 表示期望。
\(h_{i, j}=\sum_{k>j} h_{i-1, k}\times g_{n - i + 1, j}+\sum_{k<j} h_{i-1,k}(\sum_{k<l\le j} P_l\prod_{l\le m<j} g_{n - i + 1, m})\)。
\(H_{i-1,k} \to H_{i, j}(k > j)\) 这部分贡献是比较好处理的。
\(f_{n - i + 1, m}\) 的的贡献是
\(h_{i, j}=\sum_{k>j} h_{i-1, k}\times g_{n - i + 1, j}+\sum_{k<j} h_{i-1,k}(\sum_{k<l\le j} P_l\prod_{l\le m<j} g_{n - i + 1, m}\sum_{l\le m<j} f_{n - i + 1, m})\)。
\(\color{red}{\texttt{[数据删除]}}\)
Loj Contest 7B 验题
如何计算树上独立集的个数?
设 \(f_{i, 0/1}\) 表示 \(i\) 不取 / 取的方案数,则有
\( \begin{cases} f_{i, 0} = \sum f_{v,0} + f_{v, 1}\\ f_{i, 1} = \sum f_{v,0} \end{cases} \)
为了让它像树形 dp,我们设 \(g_{i, 0}=\sum f_{v, 0} + f_{v, 1}, g_{i,1} = \sum f_{v, 0}\)。
则 \(\begin{bmatrix}f_{son, 0}, f_{son, 1}, 1\end{bmatrix}\times \begin{bmatrix}1, 1, 0\\1,0,0\\g_{i,0},g_{i,1},1 \end{bmatrix} = \begin{bmatrix}f_{i,0}, f_{i, 1}, 1\end{bmatrix}\)。
考虑树剖维护。
\(\color{red}{\texttt{[数据删除]}}\)
AT_agc005_d
钦定某一部分下标是不合法的。
对于一个 \(a\),有至多两种非法值可以选:\(a+k, a-k\)。
反过来对于一个非法值 \(a\),也有至多两种合法值可以选。
对于每一个非法值 \(a\):
- 如果它有两个对应的 \(a'\),则在它们之间连边
- 否则,连自环。
综合下来,整个图应该是带若干自环的森林,树上 dp 即可。
P5339
钦定至少有 \(k\) 个四人帮讨论蔡徐坤。
然后剩下 \((n - 4k, a - k, b - k, c - k, d - k)\)。
设 \(f_i\) 表示选 \(i\) 个数的方案数,然后随便 dp 一下就做完了。
CF1487G
不存在长度为奇数且大于 \(1\) 的回文串。
这代表,\(\forall i, s_i\neq s_{i-2}\)。
然后再看看这个条件,\(\frac{n}{3}<c_i\)?有啥用呢?
我们先假设不管 \(c_i\) 的限制乱放。这种情况是十分简单的。
不过有些字母可能会不够用。幸运的是,这种字母最多只有两个。
设 \(f_{i, j, k, l}\) 表示钦定两种字符是特殊字符,第一种出现了 \(i\) 次,第二种出现了 \(j\) 次,\(i - 2\) 是 \(k\),\(i - 1\) 是 \(l\) 的方案数。(\(k,l\in [0, 2]\))。
P9546
首先写一个暴力计算 \(\operatorname{SG}\)。
容易找规律出结论,然后线段树维护即可。
P3734
不考虑障碍点,从 \((a, b, c)\) 走到 \((a', b', c')\) 的方案数的方案数是什么?
令 \(A =\operatorname{popcount}(a\oplus a'), B = \operatorname{popcount}(b\oplus b'),C = \operatorname{popcount}(c\oplus c')\),则 \(f_{A, B, C}\) 可以简单 dp 出。
然后做一个简单的容斥就行了。
\(\color{red}{\mathrm{P9731}}\)
首先考虑 \(S = 2\) 的情况。
我们需要把每个题目分成两组,使得出现次数之差 \(\le 1\)。
那么对于 \(S_0, S_1\) 连边,建超级原点向所有奇点连边,跑欧拉回路即可。
扩展到 \(S = 2^k\),我们只需要将 \(S_i-S_{i+2^{k-1}}\) 连边即可。
为什么?因为我们只需要每个点被连了出现次数条边,而这种连边方式会使得构造很方便。
CF342D
状压,\(f_{i, j}\) 表示第 \(i\) 列状态为 \(j\) 的方案数。
然后随便做。
AGC025D
从值域的角度来思考问题,按照值从小往大填。
考虑设 \(f_{S}\) 表示 \(S\) 中都被填过了的方案数。转移可以枚举当前这个数放的位置。
CF1626F
有 \(M=\operatorname{lcm}(1,2,3,\cdots,16)=720720\)。
题目要求 \(E(x)\times n^k\)。其实就在求在所有情况下 \(ans\) 之和。
那么,设 \(a_i=xM+y\),\(xM\) 不管什么操作都不会变,只有 \(y\) 会变。
因此,我们分开计算贡献。\(xM\) 的贡献是好求的,\(y\) 可以经过 \(\mathcal{O}(kM)\) 的 dp 计算。
CF679E
我们发现,一个数在往上累加的过程中,最多撞到 \(\log\) 个 \(42^k\) 后就不会再撞了。
同时,只有 \(2\) 操作会带来(一个)新的值,那么如果我们每次能快速判断需不需要继续累加,我们就可以以
\(\mathcal{O}((n + m)\operatorname{polylog}(n,m,V))\) 的复杂度解决问题。
使用线段树维护。每个节点维护 \(\min\Delta\) 和 \(\operatorname{addtag}\)。
\(\min\Delta\) 表示,这个节点中的点到下一个 \(42\) 的幂的最小距离。
如果 \(\operatorname{addtag}\ge \min\Delta\),就下放标记,往需要更新的子树内进行递归。
这里一开始我陷入了“必须恰好相等”的误区。事实上,即使不是准确的 \(42^k\) 也可以下传更新,因为势能会减小。
P3266
快进到结论:从 \((0, 0)\) 出发到 \((n + m + 1, n)\) 的方案数,禁止通过直线 \(y=x+1\) 和 \(y=x - (m + 2)\)。
反射容斥即可。
P4198
单侧递归线段树。
每个节点维护前缀最大值个数?不行,因为初值不同会导致前缀最大值个数发生变化。
当我们要查询一个节点的前缀最大值个数的时候,
- Case 1:当前前缀最大值 \(>\) 左子树前缀最大值。
这种情况下,我们只需要去右子树询问即可。 - Case 2:当前前缀最大值 \(<\) 左子树前缀最大值。
预处理 \(t\) 表示在左子树最大值的基础上的前缀最大值个数,然后右子树直接使用 \(t\) 即可。
P3792
解法一:维护 \(\max,\min, k\) 次方和。
解法二:维护 \(\max,\min\),然后将所有数映射到一个随机数上,求区间映射的数之和是否等于应该有的和。
本质:哈希。
P9631
Nim 游戏先手必胜当且仅当 \(\operatorname{xor}\) 和 \(\neq 0\)。
先求出整体 \(\operatorname{xor}\) 和 \(S\),然后
- \(S=0\),此时随意拿掉一个都能使 \(\operatorname{xor}\) 和 \(=0\)。
- \(S\neq 0\),此时可以计算总方案 \(-\) \(S=0\) 的方案数。
怎么计算呢?
只要有 \(a_i\ge S\oplus a_i\),就可以取 \(S\oplus a_i\) 使 \(S'=0\)。
问题转化为求有多少 \(a_i\ge S\oplus a_i\)。
实际上,这个只和 \(\operatorname{highbit}(S)\) 处取 \(0/1\) 有关。
可以通过吉司机线段树来维护(区间和,区间 \(i\) 位为 \(1\) 的数的个数)。
P4314
线段树维护历史和模板题。
核心是维护一个所谓“标记队列”,然后历史最大值相当于一个前缀最大值。
需要仔细思考后来的标记对前面的有何许影响。
P6242
前两个的杂交。
需要维护:
- 区间和,区间 \(\max\),区间 \(h\max\),区间 \(s\max\),区间 \(cnt(\max)\)。
标记怎么做?
- 区间加 \(add\),以及对原最大值(\(\max'\),为了方便处理贡献,这个需要减去 \(add\))特殊处理后得到的 \(n\max\)。
如何维护 \(h\max\)?
- 需要记录区间 \(add\) 的过程中的 \(\max(add)\),以及在对原最大值特殊处理的过程中的最大值 \(\max(n\max)\)。
下传标记的时候需要认真考虑。
CF380E
瞎逛的时候看到的题。
\(g([a_i, a_{i+1},\cdots, a_j])\) 的计算应当是从小往大添加的。
答案为 \(\sum \frac{a_i}{2^i}\), 其中 \(i\) 表示排名。
因为答案是输出实数,排名太小的数的贡献就可以忽略不计。
对每一个 \(a_i\) 统计贡献即可。
CF855F
P3158
首先,你可以看作按照颜色一种一种放棋子。
其次,假如我们放完一种颜色的棋子后就删掉不能放的点,剩下的依旧是一个长方形。
枚举删掉的行数 \(n'\)、列数 \(m'\),则方案数为 \(\binom{n}{n'}\binom{m}{m'}f(n', m', c)\)。
\(f(n,m,c)\) 代表将 \(c\) 枚棋子放在 \(n\times m\) 的棋盘上使得每行每列都有至少一个棋子。
这个可以容斥。复杂度应当是 \(\mathcal{O}(n^2m^2c)\)。
AT_arc058_c
设 \(f_{i, S, j, k}\) 代表目前放到了第 \(i\) 位,\(S=\{v|\exist j, \sum_{k=j}^i a_k=v\}\),\(j\) 表示离上一个关键点的距离,\(k\) 表示现在在处理 \(X/Y/Z\)。
若 \(k=0\) 即在处理 \(X\),钦定 \(j=0\)。
\(S\) 内仅需要保存 \(\le 7\) 的 \(v\)。
每次如果能匹配就跳到下一个层级,如果匹配不了则看看能撤回到那一层。
以上都是在放屁,直接让 \(S\) 保存 \(\le X+Y+Z\) 的值就做完了。
不过上面的做法是不是能做到 \(2^{\max(X+Y, Y+Z)}\) 啊(?)
另:做到 \(2^{\max(., .)}\) 是妄想。
AT_abc236_h
首先,假如没有第 \(2\) 个条件是很好做的。有第 \(2\) 个条件的话考虑容斥。
首先将 \(a\) 排序,则最后要求对于所有 \(i\in [2, n]\),都有 \(a_i\neq a_{i-1}\)。
我们尝试钦定某些下标满足 \(a_i=a_{i-1}\),再逆排序一次,相当于选一个 子集,然后钦定它们相等。
容斥系数应当是 \(-1^{(\sum |S|-1)}\)。
呜,不对。
考虑容斥集合 \(\{(i, j)|i<j\}\) 的子集再计算。
假设你钦定了 \(a\) 个数相等,对应到子集内,你可能钦定了 \(a-1\sim a^2\) 个相等。
问题转化为选择 \(k\) 条边使图联通的方案数。可以 dp。
P5933
设 \(f_S\) 表示将 \(S\) 集合内的数连在一起的方案数。
则可以容斥,\(f_S=\prod c-\sum_{T\subseteq S} f(T)\times g(S\oplus T)\)
\(g(S)\) 代表任意连的方案数。
事实上这个就是我计算上一题容斥系数的方案数。
CF997E / CF526F(弱化版)
\(\max-\min=r-l\),但是又有 \(\max-\min\ge r -l\)。
因此我们只需要计数 \(\max-\min +l-r\) 的最小值和最小值的个数即可。
扫描线 \(r\),对于每个左端点 \(l\) 记录最小值和最小值的个数,以及历史最小值的个数和。
历史和怎么维护呢?
一个节点本来就要维护:\(mn, mncnt, hsum, \Delta add\)。现在需要记录一个 \(\Delta cnt\) 表示当前节点在 \(mn=0\) 的时候被加了多少次历史和。
P3586
没有意识到剩下的是可以拆的。我的问题。
顺便学了一下树状数组上二分,一个比较 Useful 的 Trick。
P3713
对于每一种本质不同的“机动路径”,设它共出现了 \(i\) 次,则它的权值为 \(\color{red}{i^2}\)。
求总权值和。
\(i^2\) 可以理解为两个人一起走机动路径,最后路径相同的方案数。
做一个暴力 dp + 容斥即可。
不用组合意义的话,可以把 \((\sum_{i=1}^{cnt} 1)^2\) 拆开,但是和前面某个题类似,没有组合意义清晰简洁。 目前我还不会不需要组合意义的做法。
一次过样例,说实话挺开心的。😄
P3477
多重集排列公式:\(\dfrac{N!}{\prod cnt_i!}\)。
在这个题里,假设后面还剩 \(\{cnt_1, \cdots, cnt_m\}\),则方案数应该累加上 \(\sum_{i=1}^k \frac{C!}{\prod cnt!}\times cnt_k\)
随便维护就行了。
大意了,\(m\) 不是质数。质因子分解启动!
CF1776M
先二分,转化为一个判定问题。
这个问题我并不会,但是我对于所有 \(1\) 拉出来建虚树,然后在虚树上删子树验证。
这样挺好的,大样例只 WA 了不到 \(1/10\)。
我们只需要 mt19937 Sanae
,然后随机化一下再跑就过了!
LOJ4139
核心在于,计算能到达一个点的平台个数。
……真的吗?我们与其计算能到达一个点的平台个数,不如计算一个点能到达的平台个数。
这个可以类似于计算 LCA 那样容斥。
欸,可是计算了这个也没啥用啊?其实不是这样的。
\(\color{red}{\texttt{[数据删除]}}\)。
P10104
首先这题如果没有条件 2 是 P7609。考虑有条件 2 怎么做。
……等一下。
忽视条件 2 直接做复杂度是 \(\mathcal{O}(3^n\times \operatorname{Polylog}(V))\) 的,也就是,\(9\times 10^8\)。
不会了。草。
P9318
首先有一个显然的做法,直接根据斐波那契数列的 \(h\) 次方进行容斥。
具体的,设 \(f_{i}\) 为底部长为 \(i\) 的方案数,则 \(f_{i}=\operatorname{Fib}(i)^h-\sum_{j=1}^{i-1} \operatorname{Fib}(i-j)^h f_{j}\)。
这样就可以 \(\mathcal{O}(m^2)\) 做了。
能不能对着这个式子拉插?不是很行,主要是 \(\operatorname{Fib}(i)\sim a^i\),而 \(i\) 是 \(\mathcal{O}(m)\) 的。
换一个思路,设 \(f_i\) 表示右边有 \(i\) 个伸出来的插头的方案数,
\(f_i\times \binom{h-i}{j-i} \to f_{j-i}\)。
这个是 \(\mathcal{O}(n^2m)\) 的。
于是根号分治即可。
AT_agc035_f
把 \(l_i\) 的定义改成最下面的 \(l_i\) 个格子 \(+1\)。
一对序列 \((k, l)\) 对应着一个合法的网格图,但是一个网格图可能对应多个 \((k, l)\)。
可以注意到,\(k_a = b, l_b = a - 1\) 和 \(k_a = b - 1, l_b = a\) 这两组产生的网格图相同。
我们规定,假如左边和下面起了“冲突”,就让左边的“让一下”。
不允许出现 \(k_a = b, l_b = a - 1\),只保留 \(k_a = b_1,l_b = a\)。
这是充分性,必要性我也不会证。
有了充分性就可以通过容斥原理解决了。
CF913F
设 \(f_n\) 为将 \(n\) 个点的连通块执行如题意所示的操作,的期望操作次数。
设 \(g_{n, i}\) 为 \(n\) 个点最后形成的链中,链头有 \(i\) 个数的概率。
\(g\) 怎么求呢,首先 \(i\) 个数内部应该构成一个强连通分量,然后 \(i\) 个数和剩下 \(n-i\) 个数必须是 \(\{i\}\to \{n-i\}\)。
可是 \(\{i\}\to \{n-i\}\) 的概率不是很好求啊,向前面连边的概率是 \((1-p)\),向后则是 \(p\)。
换个角度,考虑每一个在链外面的点的贡献。
\(g_{n, i}=\sum_{a=1}^n\sum_{j=1}^{\min(a-1, i)} \binom{a-1}{j}\binom{n-a}{i-j}p^x(1-p)^y\)
我操,好大一坨。这玩意是 \(\mathcal{O}(n^4)\) 且难以优化。
首先,由于总的边数是 \(i\times (n-i)\),设有 \(a\) 条边是 \(p\),则有 \(i(n-i) - a\) 条边是 \((1-p)\)。
可以只考虑 \(a\)。
\(g_{n, i}=g_{n-1, i}+g_{n-1,i-1}\times a^b\)。
这样就能做 \(g\) 了。
btw \(f\) 的转移应该是整体乘以 \(\frac{1}{p}\),两种思考方法:
- 贝叶斯公式。
- 直接按照式子搞。
P4270
结论:每一层都不能有奶牛往下掉。
因为,假如你第 \(i\) 层掉了一只,那么第 \(i+1\) 层就得补一只。
最顶上一层就没东西补了。
第 \(i\) 层,周期 \(d\) 应该是 \(\gcd(i,d)\) 的因数。
又有第 \(i\) 层的周期 \(d\) 应该是第 \(i-1\) 层的倍数。
\(d_i|d_{i+1}\),\(d_i|i,d_i | d_{i+1} | i + 1\)。
这说明 \(d_i|\gcd(i, i + 1)\),即对于不是最后一层的 \(d\),都有 \(d=1\)。
对于最后一层,因为不需要满足 \(d_i|d_{i+1}\),故没有这个约束。
假如你确定了一个周期 \(d\),你就有 \(d\) 种方案。
在质因子上做一个高维前缀和(Dirichlet 前缀和?),复杂度应该是 \(\mathcal{O}(\omega(n)\sigma(n))\) 的。
Step 1, 计算有多少个 \(i\) 使得 \(\gcd(i, n)=d\)。
设个数为 \(f_d\),设 \(g_d=\frac{n}{d}\),则有
\(g_d=\sum_{d|i} f_i\),根据莫比乌斯反演有 \(f_d=\sum_{d|i}g_i\mu(\frac{i}{d})\)。
假装我们都会 \(\mu\),则计算 Dirichlet 后缀和就做完了。
Step 2,计算有多少个 \(i\) 使得 \(d|\gcd(i, n)\)。
同 Step 1,再次计算 Dirichlet 后缀和也做完了。
思考一下 \(\mu\) 怎么算。枚举质因子再跑也做完了!
周期为 \(d\) 的方案数也需要一个 Dirichlet 后缀和确定。
rnm题解做法真你妈简单啊,我是 fw /ll/ll
最终面的主题曲。
因为最终面要以BOSS为中心,所以道中仅仅只是走个过场。
曲子也是非常短的曲子,不过,是给人以清爽感觉的曲子(也许)
关卡预计给人以在樱花的海上面高速奔跑的感觉,不过,曲子也给人那种感觉了吗?