周总结
CF720D
这个题目引出了一类做法,即用集合中的一个元素代表整个集合,以达到去重的目的。
思考如果我们遇到了一个障碍,原有的路径立刻就会兵分两路,第一部分朝上行进,第二部分是在下面接着走。上面的东西在障碍的正上方汇聚在一起,这个元素代表了所有的此时往上走的路径。下方的东西都维持原样。
蒯张题解区的图片~
图里的紫色就是要被去重的路径,他们的计算会被并入绿色路径的数量中。
这个东西可以用线段树维护,支持区间推平,区间求和,单点修改。
AGC013D
可以看作是上面那道题的另一种应用。
设 \(f_{i, j}\) 为 \(i\) 次操作后剩 \(j\) 个红砖的方案数,转移方程是好想的。
但好像不对。在不同的初始状态下,尽管操作方案不同,但是最终的拿出砖的序列却是有可能相同的。
对于每一种合法的方案,在任意时刻红砖数量都在 \([0,n]\) 之间。那么假如一种操作的最终的白球与初始白球数量差为 \([-a,+b]\),那么初始白球数量肯定在 \([a,n-b]\)。
于是我们考虑用这个区间里最小的 \(a\) 代替这一堆不同情况下拿出球数相同的操作方案,那么此时肯定有一个时刻白球数等于 \(0\)。考虑反证,如果白球数没有等于 \(0\) 的时候,那么减少一点白球数使有时刻等于 \(0\) 也是合法的,但是更小。与 \(a\) 的定义矛盾。
另设一个数组 \(g_{i,j}\) 和 \(f\) 定义相同,但 \(g\) 表示触及过 \(0\) 的方案数,\(f\) 表示没有触及过 \(1\) 的方案数。
P2000 拯救世界
茶余饭后看到胡小兔大佬的生成函数简介,于是做了这道题。。。没什么好说的,推荐大家都去看看。
AGC002F
拆贡献,将每种颜色的贡献拆成作为白球和作为普通颜色球的贡献。
设 \(f_{i,j}\) 表示放了 \(i\) 个白球且放了 \(j\) 种其他颜色的方案数。
现在开始拆贡献,放白球,\(f_{i,j} \gets f_{i-1,j}\)
放普通颜色的球:\(f_{i,j} \gets f_{i-1,j} \times (n-j+1) \times C^{k-2}_{n \times k - i - (j - 1) \times (k - 1) - 1}\)
解释一下后面两个系数:首先你需要在 \(n-j+1\) 个颜色里选一个,然后你要为剩下 \(k-2\) 个该颜色的球在 \(n \times k - i - (j - 1) \times (k - 1) - 1\) 个位置中找地方放。
初始状态为 \(f_{i,0}=1\),即只放白球,还没放其他球的情况。
CF1470
vp水厂
AGC 017 F
不是很明白,下周再写。
CF311B
P5785
P2365
P2120
P3628
斜率优化附件版题
P3571
思考这样一种最优方案:前 \(i\) 层用 \(i\) 步,后面每步都走满 \(k\) 个点。只有最后一步不走满。
转化为数学语言就是 \(f(k) = max(i + \lceil \frac{s_{i+1}}{k} \rceil)\)。其中 \(s_{i+1}\) 表示深度不小于 \(i+1\) 的点个数。
这里需要证明这个的正确性,但是我时间太少,写不下。
总之,之后就可以转化为这个形式:
当在 \(k\) 下层答案 \(i\) 如果大于层 \(j\),那么 \(i + \lceil \frac{s_{i+1}}{k} \rceil > j + \lceil \frac{s_{j+1}}{k} \rceil\)。
移个项,交叉相乘:
上面的式子是在 \(j<i\) 时,\(j>i\) 时要将 \(\le\) 反过来。
发现斜率式子!我们将 \(s_{i+1}\) 看作 \(y\),\(i\) 看作 \(x\),这就是个斜率式子。
然后按 \(k\) 由小到大递推,维护一个上凸包即可得到答案。
P3547
最终最短路有三种情况:全是 \(a\),把 \(a\) 换成 \(b\)(最终可能会留下一个 \(a\)),添加一些 \(a\) 边,并把所有 \(a\) 换成 \(b\)。
第一种和第二种情况都是一遍最短路就可以求出来的,我们要求的只有第三种。
思考暴力,搜到一个点,遍历与他连边的点,再遍历与这些点连边的点更新,复杂度为边数平方。
但我们发现,再遍历这一步遍历完以后,第二次遍历到的这个点的最小值已经变成最小的了(因为搜到的点第一个被搜到,所以搜到的点距离最小,所以搜到的点 \(+b\) 距离最小)。于是我们可以把第二次遍历的边权删了。
注意这里的删指的是在第二次遍历时不会被用到,由搜到的点向外第一次遍历还是会用的。这也意味着我们要开两个边集。
复杂度怎么证明呢?考虑只有三元环不会被删掉,但三元环只有根号个,所以复杂度也是根号级别。
CF285E
看到恰好走不动路了,于是用二项式反演转恰好为钦定。
随便设状态,\(f_{i,j,0/1,0/1}\) 表示到 \(i\) 了,钦定有 \(j\) 个完美数,当前 \(i\) 选了没有,\(i+1\) 选了没有。根据这个转移即可。
P7518
把路径拆成两部分,一部分是起点到 lca,一部分是 lca 到终点。
如果我们知道起点,这就是个倍增问题了,于是我们求出每个点网上第一个出售 \(P_1\) 起点在哪里,由于第一部分走的宝石越多越好,第一部分是好求的。
来到第二部分,我们并不知道终点,于是我们离线下来 dfs 求出每个点往上第一个出售 \(P_1,P_2,...,P_n\) 的点,然后根据单调性二分枚举终点,check 条件为到达的路径连接点深度不小于 lca 深度。
P3591
数据保证了每次行走的距离是 \(k\) 的倍数,所以我们可以把行走操作转化为:两个点一起往上跳,每个点每次跳 \(k\) 步,跳到深度小于 lca 停止。
如果 \(k\) 大于 \(\sqrt{n}\),那么直接跳复杂度是对的。
否则我们在 dfs 中处理出每个点跳 \(k\) 步到达的位置(此时 \(k \le \sqrt{n}\),所以可以存得下),然后可以求出到根的前缀和,二分处理深度大于等于 lca 的终点,总复杂度为 \(O(n \sqrt{n})\)
P3505
神秘分层图!第一层为 \(1\),第二层为与 \(1\) 有边相连的点,第四层为与 \(2\) 相连的点,第五层为 \(2\)。
长度为 \(5\) 的最短路是这样的:由第一层走到第二层,由第二层走到第三层,在第三层内部走一步,再走到第四层,最后再走到第五层。
于是我们把每一层内部连边,与第二层相连的点与第二层剩下的点连边,与第四层相连的点同理。其他第三层的点向点多的那层连边最优。