寒假记录
CF 1903F:
考虑二分答案 \(ans\)。
可以得到这样的限制:
- 若选择了 \(x\),则不可以选择 \(x+1,x+2,...,x+ans-1\)。
- 对于一条边 \((u_i,v_i)\) 若未选择 \(u_i\),则必须选择 \(v_i\)。
这是一个 2-sat 的形式。但限制 1 建边太多,可以用线段树优化建图。
CF 1903D2:
先介绍一个 trick:子集 dp。
问题:有 \(n\) 个集合,元素为 \(1\) 到 \(m\),求其中为 \(s\) 的子集的个数。
先把每一个集合的信息进行状压。
然后设 \(f_{s,i}\) 表示:为 \(s\) 的子集的集合中前 \(i\) 位元素和 \(s\) 完全一致的个数。
转移:
\(f_{s,i}=f_{s,i+1}\) 当 \(s\) 的第 \(i\) 位为 \(0\)
\(f_{s,i}=f_{s,i+1}+f_{s\oplus (1<<i),i+1}\) 当 \(s\) 的第 \(i\) 位为 \(1\)。
可以通过倒序枚举省去第二维(类似 01 背包)。复杂度 \(\Theta(m2^m)\)。
当然,将问题改为 “求其中满足 \(s\) 为其子集的个数。” 也可以用类似方法解决。
回到本题,容易想到按位贪心。需要快速计算当前位为 \(1\) 时的代价。
可以发现,假设贪心到第 \(i\) 位,前若干位构成的数为 \(s\),代价即为所有前若干位不是 \(s\) 的子集的个数和前若干位是 \(s\) 的子集但第 \(i\) 为 \(0\) 的个数的和乘上 \(2^i\) 再减去前若干位是 \(s\) 的子集但第 \(i\) 为 \(0\) 的数字和。利用上述方法可以解决。还要注意 \(x\) 太大的特判。
设 \(a_i\) 最高位为 \(k\),预处理复杂度 \(\sum_{i=1}^k \Theta(i2^i)=\Theta(k2^k)\),即 \(\Theta(V\log V)\)。查询复杂度 \(\Theta(q\log V)\),总共 \(\Theta((V+q)\log V)\)
CF 1901F:
设 \(L\) 的中点为 \(M\)。 容易证明,\(S=\frac{(n-1)\times (y_0+y_{n-1})}{2}=(n-1)\times Y_M\)。 只需要最小化 \(Y_M\) 即可。
发现 \(Y_M\) 是合法的,当且仅当在 \(x=\frac{n-1}{2}\) 左右两侧分别任选一个点连线,所连线段交 \(x=(n-1)/2\) 于 \(M\) 下方。所以我们只需要在每一个时刻求一个纵坐标最大的交点。
当更新发生在 \(x=\frac{n-1}{2}\) 左侧时,右侧的状态是固定的。可以先在右侧建一个凸包,左侧每一个点分别做凸包上二分,找到纵坐标最大的交点,然后前后缀取 \(max\) 即可。
当更新发生在右侧,在左侧建凸包即可。
CF 1895F:
容易想到把序列用其差分序列表示。记 \(d_i=a_i-a_{i-1}\)($ i>1$),则 \(-k\le d_i\le k\)。
观察发现一个重要结论:只要存在一个小于 \(x+k-1\) 的位置,且存在一个大于 \(x\) 的位置,序列既满足条件一。
我们知道,只要钦定一个最小值后,差分序列便可以和原序列一一对应。所以总的方案数就是 \((x+k)\times (2k+1)^{n-1}\) 减去每一个数都小于 \(x\) 的情况数。后者可以简单 dp 求出,再把转移方程构建为矩阵,使用矩阵快速幂即可做到 \(\Theta(n\log n)\)。
CF 1854C:
观察发现,每一个元素是否被消去仅和其本身与比其略大的元素有关。尝试求每一个元素被消去前的期望操作步数,求和即为答案。
设元素 \(x\) 的后一个元素为 \(y\),初始位置为 \(a_x\),\(f_{a,b}\) 表示 \(x\) 到达 \(a\), \(y\) 到达 \(b\) 这一事件发生的概率。
转移是显然的。该元素的答案即为 \(\sum f_{i,i}\times(i-a_x)\)。 这样做的复杂度为 \(\Theta(nm^2)\),可以通过本题,但还可以做到更好。
因为 \(\sum f_{i,i}\times(i-a_x)=\sum f_{i,i}\times i- a_x\),根据期望的可加性,可以把所有 \(n\) 个元素一起计算 \(f\),并一起算贡献。可以做到 \(\Theta(m^2)\)。
CF 1842F:
设子树 \(u\) 中黑点个数为 \(val_u\)。显然的,答案为 \(\sum |k-2\times val_u|\)。显然的 \(\sum |k-2\times val_u|\ge \sum (k-2\times val_u)\)。
最重要的发现:进行换根后,以上式子一定可以取等!只需要钦定根节点为由黑点的中心即可。
所以,依次钦定每一个结点为重心,作为树根。此时,将一个节点 \(v\) 变为黑色会产生 \(-2\times dep_v\) 的贡献,故按 \(dep\) 排序,依次变为黑色,并更新答案即可。根据先前的式子,如果该节点不是重心,一定劣于最优解,故不会对答案产生影响。
CF 1854E:
考虑一个新状态合法的充要条件:
设原本为 1 的 \(m\) 个位置分别为 \(a_1,a_2,...,a_m\),操作后的位置为 \(b_1,b_2,...,b_m\),其中 \(a_i,b_i\) 单增,则 \(\sum |a_i-b_i|\le k\)。
由于两个球的相对位置不变,必要性是显然的。对于充分性,考虑一下构造:
从左往右考虑,若 \(a_i\ge b_i\),直接把将其向左移动;若 \(a_i\le b_i\),先忽略,待 \(i+1\) 至 \(m\) 个球调整完毕后再将其右移(显然的,后面的球不会移到 \(b_i\) 的左侧)。
使用这个充要条件直接 dp,可以做到 \(\Theta(k n^2)\),无法通过。
对 \(\sum |a_i-b_i|\le k\) 进行转化。设 \(x_k\) 表示小于等于 \(k\) 的 \(a_i\) 的个数,设 \(y_k\) 表示小于等于 \(k\) 的 \(b_i\) 的个数。考虑每个位置 \(k\) 被线段覆盖的次数 \(|x_k-y_k|\),得到 \(\sum |a_i-b_i|=\sum |x_i-y_i|\)。而且 \(y_i\) 具有 \(b_i\) 所不具有的性质:\(y_i-y_{i+1}\le 1\)。可以得到 \(\max |x_i-y_i| \le \sqrt{k}\)。利用这个性质 dp,可以得到一个 \(\Theta(nk\sqrt{k})\) 的做法。
CF 1814F:
显然可以用线段树分治和一个并查集维护每一个时刻图的状态,但我们需要求在所有时间内曾经和 \(1\) 联通的点。
考虑在线段树的叶结点(一个时刻)的位置在 \(1\) 的祖先上打一个标记。这个标记在并查集回撤时下传。但这样有一个小问题:
假设 \(v\) 被合并到 \(u\) 上了,但 \(u\) 已经打了标记,在回撤时,\(v\) 也会被打上标记。我们把标记具体化一些:设 \(val_u\) 表示 \(u\) 与 \(1\) 连通的时间,那么回撤时,令 \(val_v=val_v+val_u\)。为了避免上述情况,应当在合并时先将 \(val_v=val_v-val_u\),这样回撤时 \(val_v\) 加上的就是合并发生后的合法时间了。
ARC 170E:
可以把操作过程抽象为一个由 \(L\) 和 \(R\) 组成的序列。序列第 \(i\) 项为 \(L\) 表示第 \(i\) 步顺时针运动,为 \(R\) 表示第 \(i\) 步逆时针运动。
设共有 \(l\) 个 \(L\),\(r\) 个 \(R\)。答案为 \(\sum_{i=1}^l i+\sum_{i=1}^r i\)。分别考虑 \(l\) 和 \(r\) 产生的贡献。方便起见,此处只说 \(l\)。
进行 dp。设 \(f_{i,1,2}\) 表示到第 \(i\) 步为 \(l\) 的期望贡献。设 \(f_{i,0,2}\) 表示到第 \(i\) 步为 \(r\) 的期望贡献。显然,求出 \(f_{i,1,2}\) 需要知道第 \(i-1\) 步前期望有几个 \(L\)。设这个东西为 \(f_{i-1,0,1}\) 和 \(f_{i-1,1,1}\),分别表示第 \(i\) 步为 \(L\) 或 \(R\)。要求这东西还需要知道第 \(i-1\) 步为 \(L\) 的概率,同样去设。可以得到转移方程。由于 \(n\) 很大,而每一步的转移相同,考虑把转移挂在矩阵上做矩阵快速幂即可。
LOJ 3934:
第一问很简单,经典的倍增。主要说第二问。
先想一个单次询问线性的做法。设 \(i\) 向右走 \(k\) 步可以到达 \(r_{i,k}\),向左 \(k\) 步可以到达 \(l_{i,k}\)。
考虑从 \(a\) 到 \(b\) 的一条的最短路径为 \(dis(a,b)\)。那么一个位置可以位于 \(x\) 到 \(y\) 的最短路径上的充要条件是 \(dis(x,a)+dis(y,a)=dis(x,y)\)。这相当于存在一个 \(k\),使得 \(r_{x,k} \le a \le l_{y,dis(x,y)-k}\)。设 \(s_i\) 表示 \(1\) 到 \(i\) 中特殊点的个数,\(d=dis(x,y)\),可以得到答案即为 \(\sum_{i=1}^{d} s_{l_{y,k-d}}-s_{r_{x,k}}\)。把式子拆开,即为,\(\sum_{i=1}^{d} s_{l_{y,i}} -\sum_{i=1}^d s_{r_{x,i}}\)。分别用倍增维护即可。
LOJ 3935:
“从任一点出发,到固定点结束” 显得非常奇怪,考虑时间倒流,建反图。
问题转化为从固定点出发,到任意点结束,到达一个点仅初次有贡献,若到达时间为 \(t\),贡献为 \(m_i\times (s-t)\)。考虑固定到达点的集合,尝试最小化 \(m_i\times t\)。由于如果出现 \(s>t\) 的情况,该集合一定不优,所以无需处理 \(t\) 的范围。
这个问题可以 dp 解决。设 \(f_{S,i}\) 表示已达集合为 \(S\),目前位于 \(i\) 的最小答案。预处理两点之间的最短路径 \(dis_{i,j}\),将当前状态转移到一个位于目前未到达的点的状态即可。如果最短路上点为到达,那么这种转移也一定是不优的,不用额外考虑。
对于一个询问 \((s,e)\),我们需要找到一个点集 \(S\),设 \(S\) 中元素的 \(m_i\) 的和为 \(sum\),用 \(s\times sum-f_{S,i}\) 更新答案。用凸包上二分快速回答询问即可(也可以把询问离线,然后用单调性解决)。
LOJ 3956:
先考虑 \(k=1\) 怎么做。