2024 年四月做题记录

穿梭于樱花树海之下,徜徉于生与死的结界之上,离究极之真实越来越近。

Ultimate Truth


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为中心,所以道中仅仅只是走个过场。
 曲子也是非常短的曲子,不过,是给人以清爽感觉的曲子(也许)
 关卡预计给人以在樱花的海上面高速奔跑的感觉,不过,曲子也给人那种感觉了吗?

过去 | 现在 | 将来
posted @ 2024-06-25 19:16  fjy666  阅读(30)  评论(0编辑  收藏  举报