终于要有任务下来了(之前的不想做)

今天是第一次认认真真边做题边写做题记录的第一天(昨天也是但是昨天的记录丢了)

之前有段时间觉得这个东西没用。

但是当我遇到重题,或者想要复习的时候,看看以前的记录,真的很有用!!!

今天效率很高,直接点随机跳题和在 kenkoooo 里面点题效率完全不一样,还是直接随机跳题要好一点。

[MtOI2019] 幽灵乐团(数论)

\(n=\max(A,B,C)\)

type=0

\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\frac{\text{lcm} (i,j)}{\gcd(i,k)}\\ =\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\frac{ij}{\gcd(i,j)\gcd(i,k)}\\ \]

\(ij\) 部分很简单。

剩下的我们等价于要求:

\[\prod_{i=1}^A\prod_{j=1}^B\gcd(i,j)^C \]

考虑容斥,令 \(\prod\limits_{d|i}f_d=i^C\),那么剩下的都可以直接做了。

type=1

\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(\frac{\text{lcm} (i,j)}{\gcd(i,k)})^{ijk}\\ =\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(\frac{ij}{\gcd(i,j)\gcd(i,k)})^{ijk}\\ \]

那么我们同样拆成多部分:

\[\prod _{i=1}^A\prod _{j=1}^B\prod_{k=1}^C(ij)^{ijk}\\ =(\prod _{i=1}^A\prod _{j=1}^B(ij)^{ij})^{(C+1)C/2}\\ \]

这一部分不难。


\[\prod _{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(\frac{1}{\gcd(i,j)\gcd(i,k)})^{ijk} \]

对于这一部分我们只需要求解:

\[\prod _{i=1}^A\prod_{j=1}^B(\frac{1}{\gcd(i,j)})^{ij} \]

同样的,我们令 \(\prod\limits_{d|i}f_d=i\),那么我们需要求解:

\[\prod_{d=1}^n \prod_{d|i}\prod_{d|j}f_d^{ij}\\ =\prod_{d=1}^n f_d^{\sum _{d|i}\sum_{d|j}ij} \]

同样不难。

(出题人表示前面都不是重点,所以比较略)

type=2

\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(\frac{\text{lcm} (i,j)}{\gcd(i,k)})^{\gcd(i,j,k)} \]

同样分成两部分,第一部分:

\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C(ij)^{\gcd(i,j,k)} \]

我们只需要求解:

\[\prod_{i=1}^Ai^{\sum_{j=1}^B\sum_{k=1}^C\gcd(i,j,k)} \]

\(\sum \limits_{d|i}f_d=i\),则我们等价于求解:

\[\prod_{i=1}^Ai^{\sum \limits_{d|i}\lfloor \frac{B}{d} \rfloor \lfloor \frac{C}{d} \rfloor f_d} \]

\(g_d=\lfloor \frac{B}{d} \rfloor \lfloor \frac{C}{d} \rfloor f_d\) 我们必然要枚举 \(i\),那么我们需要快速求解 \(\sum \limits_{d|i}g_d\),很明显这是不难的。

第二部分:

\[\prod_{i=1}^A\prod_{j=1}^B\prod_{k=1}^C\gcd(i,j)^{\gcd(i,j,k)} \]

发现 \(\gcd(i,j)\) 比较独立,那么我们处理出 \(f_d=\sum \limits_{i=1}^A\sum\limits_{j=1}^B[\gcd(i,j)=d]\),同样处理出 \(\sum \limits_{d|i}g_d=[i=1]\) 即可计算出来 \(f\),那么原式就等于:

\[\prod_{i=1}^n(\prod_{k=1}^Ci^{\gcd(i,j)})^{f_i}\\ =\prod_{i=1}^ni^{f_i\sum \limits_{k=1}^C\gcd(k,i)} \]

\(\sum \limits_{d|i}h_d=i\),那么该式是:

\[=\prod_{i=1}^ni^{f_i\sum \limits_{d|i}^Ch_d\lfloor\frac{C}{d}\rfloor} \]

同样可以快速求出来。

(啊我怎么就推完了,这个题也不难啊)

[CF1172E] Nauuo and ODT

首先考虑单次询问,将每个颜色拉出来,求解有多少条路径至少包含一个给定点。

这就是维护所有黑色连通块的大小平方和。

我们每一次删掉一个点就等价于将所有和他相连的点删掉,这样一定会 T。

可以使用类似 CF487E Tourists 的套路,将其父亲—儿子化,如果一个点是黑色,那么就向他在树上的父亲连边,那么一个点所在联通块的大小就是 lct 上的大小减去 \(1\)

不过对于根节点还需要一个父亲,所以再多添加一个点当他的父亲即可。

维护子树 siz 就是模板,那么我们就跳到该模板题:

[BJOI2014] 大融合(lct 维护子树信息)

我们需要用 lct 维护动态加边删边下的子树大小。

具体的讲解在这里:https://www.luogu.com.cn/article/8c1adp79

反正只要虚链改变就一定要更新 siz2

[CF793G] Oleg and chess

考虑二分图模型,矩形限制等于在两个区间内的点对没有连边。

考虑主席树优化建图,顺序扫二分图一边,每一次会有一个区间无法连接,似乎不能直接做?但是这道题保证了矩形不相交,直接做就行了。

[POI2009] KAM-Pebbles(阶梯博弈)

不妨考虑差分数组,博弈就变成了:拿走 \(i\) 里面的 \(x\) 个石头,会给 \(i+1\) 里面 \(x\) 个石头。

原来这是一个阶梯博弈的模板题。

我们只需要把和 \(n\) 奇偶性不同的点拿出来做 nim 游戏即可,同样用抵消操作来进行解释:

移动奇偶性不同层的石头,看作 nim 游戏,而如果有谁移动了奇偶性相同层的石头,那么下一个人为了保持当前的状态可以将这些石头再往下移动即可。

[ATCF17FinalJ] Tree MST

考虑 Boruvka 算法,那么我们需要从一个点出发寻找不在他当前集合内的,边权最小的点即可,可以直接用点分树。

(就当 Boruvka 练手题了)

事实证明太久没写点分树了,注意求重心的时候清零 \(f\)!!!。

[BJOI2012] 最多的方案

挺有意思的题目。

首先通过样例可以发现,任意一个方案都可以是另一个方案通过斐波那契分裂/合并的形式来得到的。

所以我们先贪心的选择斐波那契最大的数来凑出一个方案,那么我们的问题就变成了:

每一次可以将 \(100\) 变成 \(011\),问方案数。

这个就很简单了,直接设 \(f_{i,j}\) 表示 \(\gt i\) 的数对 \(i\) 这一位造成贡献为 \(j\)\(\leq i\) 的方案数即可。

顺口一提,在知乎里找到了一个结论:一个数列能凑出所有正整数的充要条件是 \(pr_i+1\geq a_{i+1}\)

[JOISC2016] サンドイッチ

首先判断能否吃掉。

对于两块三明治,我们如果吃掉其中一块,那就一定能立刻吃掉另外一块。

而一个小正方形能吃掉,当且仅当斜边某方向上的两边接壤的正方形都要被吃掉。

那么每一次能吃就吃,这样就可以判断 \(-1\) 的情况了。


接下来考虑最短的这个要求。

最优方案中,如果吃了一个正方形一边,另一半边一定也会被立即吃掉。

注意到,如果我们一上来就定好我们这一个正方形哪一个先吃,那么后面的操作都是固定的。

直接搜索已经有 \(O(n^4)\) 的优秀时间复杂度了。

不过还需要进一步优化了,这里我考察图的 \(2-\text{sat}\) 性质失败了,正解是对于每一行靠左的那一块进行求解时,会发现纵坐标大的需要吃的三明治严格包含纵坐标小的三明治,所以对于一行,一个点只需要遍历一遍,时间复杂度 \(O(n^3)\)

[AGC029E] Wandering TKHS

一直想用点分树的形式来解决这个问题,但是这个思路走不通。

考虑一个点 \(v\) 对另一个点 \(u\) 的贡献,那么 \(u\) 一定先走到 \(\text{lca}(u,v)\),在经过 \((1,\text{lca}(u,v))\) 上的最大值时 \(v\) 最有可能被扩展到,所以充要条件就是:

\[\max\limits_{w\in path(\text{lca(u,v),1})} w\gt \max \limits_{w\in(\text{lca}(u,v),v]}w \]

那么考虑枚举 \(\text{lca}\),我们需要得到子树内所有点到达它的路径最大值,直接线段树,需要支持:合并,区间查询,单点修改,区间推平,合并。

不过一个更厉害的做法是,注意到两段路径合起来就是 \(w\) 到根上的所有点(除掉 \(\text{lca}\)),计算一个点到 \(1\) 的最大值,若在该最大值下面,那么一定满足条件,如果在最大值上面,一定不满足,如果在最大值上,计算路径上的次大值,看看和最大值的位置关系即可。

[AGC034D] Manhattan Max Matching

曼哈顿距离......先转化成切比雪夫距离,毕竟最大价值和切比雪夫里的 \(\max\) 是同向的。

考虑优化边数,把一个点分成两个点,分别代表计算横纵坐标的贡献,不失一般性的,我们先来考虑 \(x\) 轴的贡献。

绝对值可以考虑排序,将 \(x\) 轴的点排序,顺次连接,贡献为他们只差,那么边数被降到了 \(O(n)\) 的规模,我们来分析一下费用流的时间复杂度:

由于流量很少,增广轮数为 \(O(n)\),每一轮也便利不超过 \(O(n)\),时间复杂度 \(O(n^2)\)

(然后我点开题解,发现这道题的题解我很久以前就看过了)

[AGC024F] Simple Subsequence Problem(新奇 dp 状态)

考虑所有长度的所有串,统计他在 \(S\) 作为子序列的数量。

子序列匹配的过程:每一次选择最近的一个字符进行匹配。

这样做的好处是匹配过程唯一。

那么我们就设 \(f_{A,B}\) 表示,我们已经匹配了 \(A\) 这个串,还剩下 \(B\) 这个串的方案数。

由于 \(|A|+|B|\leq N\),所以状态数量为 \(O(n2^n)\)

这是一个很新奇的 dp 状态。

[ARC146E] Simple Speed

不妨考虑折线图 dp,\(f_{i,j,0/1,0/1}\) 表示考虑了 \([i,n]\) 的数的位置,有 \(j\) 个连续段,两边是否结尾了的方案数。时间复杂度 \(O(n^2)\)

想把 \(f\) 公式化,但是失败了,结果优化方法是,由于状态数很少,直接用 map 存状态即可,而且其实也很好理解,每一层 \(j\) 只有 \(5\) 的大小。