2023.12.10 近期练习
CF1868C
首先想拆开每条路径的贡献。
对于一条路径,长度为 \(len\) 枚举最大值为 \(x\),那么贡献是 \(x\times(x^{len}-(x-1)^{len})\times m^{n-len}\)。
其中 \(x^{len}-(x-1)^{len}\),表示最大值小于等于 \(x\) 的方案数容斥掉最大值小于等于 \(x-1\) 的方案数。
如果我们知道所有长度为 \(len\) 的路径个数 \(Ans_{len}\),那么就可以通过枚举最大值的方式来计算贡献。
现在只需求出 \(Ans\),其中定义域大小为 \(O(\log n)\)。
在转移的时候,只需要记录 \(f_i,g_i\) 分别表示当前长度为 \(i\) 的路径条数;长度 \(i\) 到根的路径条数。
\(f_i=f_{ls,i}+f_{rs,i}+g_i+\sum_{j+k+1=i} g_{ls,j}\cdot g_{rs,k}\)
看似状态数为 \(O(n)\),但是一个完全二叉树左右儿子至少有一个是满二叉树,所以实则只有 \(O(\log n)\)。
然后便做完了。
这种问题有关若干元素的贡献的和,应考虑拆贡献,找到相同性质的元素集合,并且独立计算。
CF1874B
先观察操作的性质,但是好像并没有发现什么性质。
\(2^{31}\) 太大,无法进行预处理。
但是,二进制操作想到了每位都是独立的。
把每位拆开来,设 \((a,b,m,c,d)\) 为当前位的状态,仔细观察到。
如果对于相同的 \((a,b,m)\),\((c,d)\) 不同, 就不可能实现,因为操作都是整体的。
所以剩下的状态就少了 \((a,b,m)\) 有 \(8\) 种,\((c,d)\) 加上无限制有 \(5\) 种,总共状态只有 \(5^8=390625\)。
总共的状态很少,就考虑使用 BFS 完成。
BFS 方法是,设 \(a=(00001111)_2,b=(00110011)_2,m=(01010101)_2\),这样囊括了所有情况。
初始状态为 \(c=a,d=b\),然后更新 \((c,d)\) 而非 \((a,b)\)。
这种问题有关二进制,应考虑拆位,拆位后整体考虑。
CF1889C2
首先想,转化为覆盖面积最小,但是也没有发现什么。
所以设计一个 dp,设 \(f_{i,j}\) 表示考虑到第 \(i\) 位,已经删除了 \(j\) 条线段的最值。
如果硬要从 \(f_{i-1}\) 转移,是无法转移,因为不知道 \(i\) 位要空还要删几条线段。
所以设 \(f_{i,j}\) 表示上一次空的是在 \(i\),已经删除了 \(j\) 条线段的最值,尝试后这样是方便转移的。
\(f_{i,j}=\max_{k=0}^{i-1}(1+f_{k,j-t})\),其中 \(t\) 表示使得 \(i\) 变空还要删除几条线段。
由于 \(k\) 是空的,所以 \(k\) 上没有线段,如果一条线段越过 \(k,i\),那么其已被删除,就可以不删。
所以 \(t\) 的值就是 \(i\) 上空线段的数量减去越过 \(k,i\) 线段的数量,发现 \(t\) 实则是递减的。
且 \(t\le 10\),所以只会有 \(10\) 段,所以就变成一个 RMQ 的形式。
每个 \(j\) 都用 ST 表实现 RMQ,复杂度为 \(O(n\log n+100n)\)。
具体的,我们对于每个位置都维护当前越过它的线段有哪些,这个可以用扫描线实现。
有一个细节,就是当前位置上线段大于 \(10\) 就是不可能为空了的。
这种问题应该考虑合理的设计状态,另一方面是观察单调性。
CF1837F
一开始看错题了。
题意转化一下,寻找 \(i\),使得 \([1,i]\) 中选 \(t\) 个数求和与 \([i+1,n]\) 中 \(k-t\) 个数和的 \(\max\) 最小。
最大值最小显然是二分答案,设二分的值是 \(mid\),考虑枚举切点 \(i\)。
肯定是把小于 \(mid\) 的能选就选,从小到大选,只需要看最后选出是否不小于 \(k\) 个数即可。
考虑线段树上二分。然而常数过大,经启发可以换成树状数组上倍增。
复杂度 \(n\log n\log V\)。
这种问题应该学会使用树状数组代替线段树。
CF1860E
过于一眼。
由于对于一个组的点,要两两连接在一起,这时候不得不拿出一个经典套路:
建立虚点,边权 \(0.5\),然后连向一个组的所有点。为方便将边权 \(\times2\)。
由于虚点非常少,只有 \(26^2=676\) 个,这启发我们对于每个虚点跑一遍 BFS。
对于每次询问来说,只需要遍历所有虚点,求强制经过这个点的最短路。
但是如果不经过虚点了呢?我们可以直接作差求绝对值求出不经过虚点的长度。
这样就做完了。关于边权是 \(1,2\) 的 BFS,我们考虑将 \(2\) 的拆成两个点就行了。
复杂度是 \(O(676(n+q))\)。
这种问题考虑优化建图,即虚点的使用。

浙公网安备 33010602011771号