2023.10.19 近期杂题
P5665 [CSP-S2019] 划分
考虑贪心,发现一个神秘的性质是,最后一段如果放最小就最优,无论是对前面和对后面都最优。
因为在 \(a>b\) 情况下,\(a^2+b^2<(a+1)^2+(b-1)^2\)。
所以直接维护一个单调队列即可。使用 __int128
.
P7984 [USACO21DEC] Tickets P
首先我们可以建反图分别求出 \(1\),\(n\) 到每个点的最短路 \(d_{1,i},d_{n,i}\),令答案数组 \(Ans_i=d_{1,i}+d_{n,i}\).
然而这样做使得答案算重复了,可能到 \(1\) 和到 \(n\) 会经过重复的点是不用再次计算。
我们可以又有一个方程:若存在边 \(i\to v\),\(Ans_i\to \min(Ans_i,Ans_v+w_{i\to v})\).
发现这个也是最短路松弛的形式,再把 \(Ans\) 数组跑一遍最短路即可。
注意要线段树优化建图。
CF1188C Array Beauty
注意到要求长度为 \(k\) 的所有子序列,既然求所有,那么把序列 \(b\) 排序后也是一样的。
\(b\) 排序后那么 \(\min(|b_i-b_j|)\) 一定在相邻的两项中产生。
如果值域是 \(V\),注意到答案的上届是 \(\frac{V}{k}\),那么我们可以枚举答案计算。
然而如果计算最小值等于某数是困难的,发现计算最小值不小于某数是容易的。
求出 \(f_{i,n,k}\) 表示 \(\min(|b_i-b_j|) \ge i\),考虑了 \(n\) 个数取了 \(k\) 个数的方案数。
差分一下即可。
复杂度是 \(O(nk)\times O(\frac{V}{k})=O(nV)\).
CF587E Duff as a Queen
注意到线性基是不可删除的。
我们是很难处理更改元素的,尤其是区间修改。
注意到 \(\{a_1,a_2,...,a_n\}\) 组成的线性基等价于 \(\{a_1,a_1\otimes a_2,a_2\otimes a_3,...a_{n-1}\otimes a_n\}\).
如果差分数组 \(b_i=a_i\otimes a_{i-1}\),
那么我们维护 \(b\) 的线性基,支持单点修改,区间查询,线段树,修改直接暴力。
还有维护 \(a\) 数组,支持区间修改,单点查询。
最后每次查询就是 \(a_l\) 与 \(b_{l+1,l+2,...r}\) 组成的线性基。
CF660F Bear and Bowling 4
观察到可以前缀和处理出 \(sum_i=sum_{i-1}+a_i\),和 \(sum2_i=sum2_{i-1}+a_i\times i\),
那么剩下的就是一个斜率优化,直接上李超线段树方便计算。
CF848C Goodbye Souvenir
观察到某个元素最后一次出现位置减去第一次出现位置并不好处理。
发现其可以转化为某个元素每一次出现位置减去上一次出现位置的和。
变成若干个点 \((i,pre_i)\),权值是 \(i-pre_i\)。
那么询问变成了二维数点,每次询问的就是 \([l,r]\times [l,r]\) 内的所有点的权值和。
树套树或者 cdq 分治。
CF508D Tanya and Password
套路题,把 xyz
看做是 xy
\(\to\) yz
连的一条有向边,直接跑欧拉回路即可。
CF1111E Tree
明显的 dp 状态设计为 \(dp_{i,j}\) 表示前 \(i\) 个点分了 \(j\) 个组的方案数。
我们现在要设计一种 dp 的顺序,方便我们转移。
考虑求 \(f_i\) 表示 \(i\) 有多少个祖先是询问的,把每个询问的点标记。
因为有换根,我们可以树链剖分把 \(i\to rt\) 求路径上的点的个数求出 \(f_i\).
按照 \(f_i\) 从小到大的顺序 dp,因为 \(i\) 祖先的点 \(f_i\) 势必更小那么肯定已经被计算了。
由于 \(i\) 的所有祖先互相不在一个组内,而 \(i\) 也不能跟他们一组,如果不新建一组的话:
\(dp_{i,j}\to dp_{i,j}+dp_{i-1,j}\times \max(0,j-f(i))\).
如果新建一组 \(dp_{i,j}\to dp_{i,j}+dp_{i-1,j-1}\).
最后答案是 \(dp_{k,m}\).