终于要有任务下来了(之前的不想做)
今天是第一次认认真真边做题边写做题记录的第一天(昨天也是但是昨天的记录丢了)
之前有段时间觉得这个东西没用。
但是当我遇到重题,或者想要复习的时候,看看以前的记录,真的很有用!!!
今天效率很高,直接点随机跳题和在 kenkoooo 里面点题效率完全不一样,还是直接随机跳题要好一点。
[MtOI2019] 幽灵乐团(数论)
令 \(n=\max(A,B,C)\)。
type=0
\(ij\) 部分很简单。
剩下的我们等价于要求:
考虑容斥,令 \(\prod\limits_{d|i}f_d=i^C\),那么剩下的都可以直接做了。
type=1
那么我们同样拆成多部分:
这一部分不难。
对于这一部分我们只需要求解:
同样的,我们令 \(\prod\limits_{d|i}f_d=i\),那么我们需要求解:
同样不难。
(出题人表示前面都不是重点,所以比较略)
type=2
同样分成两部分,第一部分:
我们只需要求解:
令 \(\sum \limits_{d|i}f_d=i\),则我们等价于求解:
令 \(g_d=\lfloor \frac{B}{d} \rfloor \lfloor \frac{C}{d} \rfloor f_d\) 我们必然要枚举 \(i\),那么我们需要快速求解 \(\sum \limits_{d|i}g_d\),很明显这是不难的。
第二部分:
发现 \(\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\),那么原式就等于:
令 \(\sum \limits_{d|i}h_d=i\),那么该式是:
同样可以快速求出来。
(啊我怎么就推完了,这个题也不难啊)
[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\) 最有可能被扩展到,所以充要条件就是:
那么考虑枚举 \(\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\) 的大小。