做题记录 25.5.22
\(\textcolor{blue}\odot\) P10875 [COTS 2022] 游戏 M
定义边权为边加入的时间,求出最小生成森林,把询问挂在两个端点上,然后从小到大枚举非树边,依次尝试覆盖到树上
用并查集维护边双,其中边双的代表元为边双中深度最小的点,若要把 \(u-v\) 覆盖到树上,则把 \(u-\text{lca}(u,v)\) 和 \(v-\text{lca}(u,v)\) 并在一起,在并查集上跳过已经缩起来的部分
第 \(i\) 条边合并并查集的两个连通块 \(S\) 和 \(T\) 时,对于所有 \(u\in S,v\in T\) 或 \(v\in S,u\in T\) 的询问 \((u,v)\),其答案为 \(i\)
设 \(|S|<|T|\),则枚举一端在 \(|S|\) 中的询问,若另一端在 \(T\) 中则令其答案为 \(i\),否则把这个询问加入 \(T\),合并后的连通块的询问为 \(T\) 中询问
总时间复杂度 \(O(m\alpha(n)+q\log q)\)
\(\textcolor{purple}\odot\) P7684 [CEOI 2005] Depot Rearrangement
令 \(S_{i,v}\) 为第 \(i\) 段中值 \(v\) 出现的位置的集合,\(c_{i,v}=|S_{i,v}|\)
当 \(c_{i,v}=1\) 时显然不会修改这一位置,当 \(c_{i,v}=0\) 时需要从其他段向这一段中移动一个,当 \(c_{i,v}>1\) 时当前段可以向其他段移动
建立一张有向二分图,\(n\) 个左部点分别表示每一段,\(m\) 个右部点分别表示每种值,\(L(u)\to R(v)\)(其中 \(L\) 表示左部点,\(R\) 表示右部点)表示 \(u\) 段多一个值 \(v\),\(u\to v\) 表示 \(u\) 段少一个值 \(v\),若 \(c_{i,v}=0\) 则连 \(L(i)\gets R(v)\),若 \(c_{i,v}>1\) 则连 \(c_{i,v}-1\) 条 \(L(i)\to R(v)\)
对于其中的一个环 \(R(p_1)\to L(p_2)\to\cdots\to L(p_k)\to R(p_1)\),显然 \(2\mid k\),用 \(\text{pop}(S_{i,v})\) 表示从 \(S_{i,v}\) 中取出一个位置,令 \(p=[\text{pop}(S_{p_k,p_1}),\text{pop}(S_{p_{k-2},p_{k-1}}),\text{pop}(S_{p_{k-4},p_{k-3}}),\cdots,\text{pop}(S_{p_2,p_3})]\),则可以依次操作 \((p_1,nm+1),(p_2,p_1),\cdots,(p_{\frac k2},p_{\frac k2-1}),(nm+1,p_{\frac k2})\) 从而消除这些边
用 \(\frac k2+1\) 次操作消除 \(k\) 条边,要使操作次数最小,则环的数量要最小,因此对于图的每个连通块找出一条欧拉回路(可证每个连通块必然有欧拉回路),对其操作即可
时间复杂度 \(O(nm)\)
\(\textcolor{blue}\odot\) CF1843F2 Omsk Metro (hard version)
由于序列只有 \(+1\) 和 \(-1\),设 \(mx\) 为序列最大可空子段和,\(mn\) 为最小可空子段和,则存在和为 \(x\) 的子段当且仅当 \(x\in[mn,mx]\)
问题转化为动态树上链最大子段和,倍增维护即可,时间复杂度 \(O(\sum n\log n)\)
\(\textcolor{purple}\odot\) CF1844F2 Min Cost Permutation (Hard Version)
当 \(c\ge 0\) 时可证最优策略为将 \(a\) 从小到大排序
当 \(c<0\) 时,对称地 \(a\) 从大到小排序价值取到最小,但字典序不一定最小
此时令 \(c'=-c\),则价值为 \(\sum_{i=1}^{n-1} |b_{i+1}-b_i+c'|=\sum_{i=1}^{n-1}|c'-(b_i-b_{i+1})|\),若 \(b_i-b_{i+1}>c'\) 则贡献为 \((b_i-b_{i+1})-c'\),否则贡献为 \(c'-(b_i-b_{i+1})\)
对于 \(b_i-b_{i+1}>c'\) 的情况若存在 \(\ge b_i\) 的和 \(\le b_{i+1}\) 的值交换,可证价值一定变大,因此将序列从中间分开,得到若干段,段内交换最优
可证段内第一个值不取最大值或最后一个值不取最小值一定使价值变大
若重排后段内新增 \(b_i-b_{i+1}>c'\) 的情况则价值变大,且若不增加则价值不变
因此转化为有序列 \(a_{1\sim n}\),其中 \(a_1\ge a_2\ge\cdots\ge a_n\),要重排 \(a_{2\sim n-1}\),使得任意 \(a_i-a_{i+1}\le c'\)(且初始满足此条件),且字典序最小
贪心从前往后选择,用链表保存还没有确定的数,用 set 保存链表中可删去的位置(一个位置可删去当且仅当删去它后其前驱 \(a_p\) 后继 \(a_s\) 满足 \(a_p-a_s\le c'\)),每次根据上一个值和 \(a_i-a_{i+1}\le c'\) 的限制二分出当前值的范围,贪心选择最小的即可
时间复杂度 \(O(\sum n\log n)\)
\(\textcolor{blue}\odot\) CF1842E Tenzing and Triangle
操作二显然两两不交,否则不优
令 \(f_i\) 表示三角形 \((x,y)\mid (x+y\le k,0\le x\le i)\) 内操作 \(2\) 在操作 \(1\) 基础上的最大减小量,答案为 \(\sum c_i-f_k\),转移为
扫描 \(i\) 时用一棵线段树对于每个 \(j\) 维护 \(f_{j-1}+aj+\sum_{k=1}^n[x_k\ge j][y_k\ge k-i]c_k\) 的值,转化为区间加和求区间和
时间复杂度 \(O((n+k)\log k)\)
\(\textcolor{purple}\odot\) CF1842G Tenzing and Random Operations
令 \(b_i\) 为第 \(i\) 次操作时选择的后缀,则要求 \(E_b(\prod_{i=1}^n (a_i+v\sum_{j=1}^m [b_j\le i]))\)
把乘积看为从 \(n\) 个括号中分别选择一项相乘,则只用到了 \(O(n)\) 个 \(b_i\)
令 \(dp_{i,j}\) 表示 \(a_{1\sim i}\) 中选择了 \(j\) 个 \(b_i\) 产生的贡献
则 \(dp_{0,0}=1\),答案为 \(n^{-m}\sum_{i=0}^{\min(n,m)} n^{m-i}dp_{n,i}\)
转移为
时间复杂度 \(O(n^2)\)

浙公网安备 33010602011771号