2023.11.5 近期杂题

CF285E

如果我们强制令 \(i\) 个位置满足 \(|P_i-i|=1\),其他任意,记这个方案数是 \(F(i)\).
对于恰好有 \(m\) 个位置满足条件的,记其为 \(G(i)\),发现 \(F(m)=\sum_{i=m}^n C_i^m\times G(i)\)
这是因为每个恰好 \(m\) 个满足条件的,会在 \(F(i)\) 被统计 \(C(i,m)\) 次。
二项式反演得到 \(G(m)=\sum_{i=m}^n (-1)^{i-m} \times C_i^m \times F(i)\)
关于 \(F\) 的求法,我们可以设计一个 dp,\(f_{i,j,0/1,0/1}\) 表示前 \(i\) 位选了 \(j\) 个,\(i\) 是否被选,\(i+1\) 是否被选。
\(F(i)=(n-i)!\times f(i)\)

CF808E

考虑三种重量分开计算,对于重量相同的,肯定是贪心取大的。
先求出不选 \(3\) 的最大答案。
我们现在枚举 \(3\) 取多少个,注意到每次 \(1,2\) 个数的改变是小的,通过证明是在 \([-1,4]\) 之间。
那么枚举这个小的变化,同时更新答案。

CF280C

考虑拆贡献,设 \(f_i\)\(i\) 被选中次数,\(Ans=E(\sum f_i)=\sum E(f_i)\).
如何计算 \(f_i\)\(i\) 如果被选那么 \(i\) 的祖先一定不能先选,设 \(i\) 的深度是 \(dep_i\),那么 \(f_i=\frac{1}{dep_i}\).
\(Ans=\sum \frac{1}{dep_i}\).

CF985G

考虑容斥,计算总贡献再减去连 \(1,2,3\) 条边的。
\(3\) 条边,直接跑三元环即可。
\(1\) 条边,枚举这条边,剩下那个点任意。注意这里会把连 \(2\) 条边的计算了两次。
\(2\) 条边,枚举中间那个点,再枚举其中一条边,计算贡献。此时贡献是 \(-1\),因为被多算了。

CF788C

看出来要求平均数是 \(n\) 最少代价。
把每个数都减去 \(n\),那么现在要求和是 \(0\) 的最小代价。
直接背包,或 BFS。

CF487E

考虑图上的路径性质并不好,考虑建树。
发现可以建出圆方树。每个方点存储其儿子的 multiset。
直接套上树剖即可。

CF1370F2

首先第一次询问可以把所有点都询问,得出 \(x,dis\)
考虑以 \(x\) 做根,考虑二分深度 \(d\),每次询问 \(d\) 深度的所有点,如果 \(dis'>dis\),那么 \(u,v\) 肯定深度小于 \(d\)
这样可以询问出深度大的点 \(u\),再把 \(u\) 距离为 \(dis\) 的点询问一遍得到 \(v\)
注意二分的下届可以调成 \(dis/2\),可以少一次询问。

CF914F

考虑 bitset 乱搞,每个字符存一个 bitset,存储其位置。
匹配的时候就每个字符所有位置一起匹配,匹配的结果与起来就是答案。
如果询问区间的话就在 bitset 右移差分。

CF351C

套路的把左括号看成 \(1\),右括号 \(-1\)
对于每个长度为 \(n\) 的块,首先 dp,设 \(g_{i,j,k}\) 表示当前考虑到 \(i\),前缀最小值是 \(j\),当前前缀是 \(k\)
每个块作为阶段转移,但是状态还要存一维,表示当前前缀。
注意到前缀和只需要开 \([0,2n]\) 就够了。因为块的顺序是可以合理的调换的。
由于 \(m\) 比较大,可以使用矩阵乘法优化。

CF559E

先把 \(a_i\) 从小到大排序。
考虑设计状态 \(f_{i,j,o}\) 表示当前处理到 \(i\),最右边的是 \(j\),方向为 \(o\)
如果 \(i\) 转移到 \(i+1\),会出现问题,如果 \(i+1\) 覆盖了 \(i\) 之前的贡献我们无法计算。
考虑 \(i\) 直接转移到 \(k\),并忽略 \([i+1,k-1]\) 的贡献,尽管可能算错,但是最优方案一定被计算了。
但是还有问题,那就是最右边点的问题,对于 \([i+1,k-1]\) 的点超过了 \(k\),我们没有计算到。
那么我们可以顺便取上 \([i+1,k]\) 右端点的最大值。

posted @ 2023-11-05 22:20  s1monG  阅读(11)  评论(0编辑  收藏  举报