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))\)
这种问题考虑优化建图,即虚点的使用。

posted @ 2023-12-11 22:17  s1monG  阅读(29)  评论(0)    收藏  举报