做题记录 25.3.16
\(\textcolor{blue}\odot\) CF2002E Cosmic Rays
从左往右扫描,维护一个单调栈,栈中存储若干个二元组 \((t,c)\),表示一个 \(c\) 颜色的连续段,到 \(t\) 时刻被消除
初始栈为空,要加入一组 \((a_i,b_i)\) 时,若栈非空且栈顶的 \(t\) 不超过 \(a_i\),则弹栈
弹栈之前需要判断一下,若栈顶下一个连续段的颜色和 \(b_i\) 相同,令栈顶的 \(t\) 为 \(t_1\),栈顶下一个连续段的 \(t\) 为 \(t_2\),则在 \(t_1\) 时刻两个同色连续段就可以合并,之后的 \(t_1-t_2\) 个时刻内 \((a_i,b_i)\) 不会变化,即两个连续段合并后 \((a_i,b_i)\) 完全消除的时间增加了 \(t_1-t_2\),因此令 \(a_i\) 加上 \(t_1-t_2\)
最终把 \((b_i,a_i)\) 压入栈,栈底的 \(t\) 即为当前的答案
时间复杂度 \(O(\sum n)\)
\(\textcolor{blue}\odot\) CF2002D2 DFS Checker (Hard Version)
可证 排列 \(p\) 可以成为 \(\text{dfs}\) 序当且仅当 \(\forall 1\le i<n\),有 \(p_{i+1}\) 在子树 \(fa_{p_{i}}\) 内
因此修改时维护 \(\sum_{i=1}^{n-1}[p_{i+1}\in \text{subtree}(fa_{p_i})]\),若值为 \(n-1\) 则为 \(\text{dfs}\) 序,反之不是
时间复杂度 \(O(n+q)\)
\(\textcolor{blue}\odot\) CF2001E1 Deterministic Heap (Easy Version)
令 \(f_{i,j}\) 表示 \(i\) 层,根的值为 \(j\),且满足要求的堆的数量,\(g_{i,j}\) 表示 \(i\) 层,根的值为 \(j\) 的堆的数量
根据每次一条链加的方式,建出的一定为大根堆,且在该基础上满足任意结点的权值不小于两个儿子权值之和
则转移为
可预处理前缀和优化到 \(O(nm^2)\)
\(\textcolor{blue}\odot\) CF1998E2 Eliminating Balls With Merging (Hard Version)
令 \([L_i,R_i]\) 为满足 \(a_i\) 为最大值的极大区间
从大到小(值从大到小)考虑每个位置 \(i\),求出该位置能贡献到的右端点的区间 \([rL_i,rR_i]\)(显然贡献到的右端点一定为区间),得到 \(rL,rR\) 后容易计算答案数组
显然 \([rL_i,rR_i]\subseteq[i,n]\)
若右端点为 \(rp\),则从 \(i\) 开始的最优决策是先把 \([L_i,\min(rp,R_i)]\) 内的合并,若此时值 \(\ge a_{L_{i}-1}\) 且 \(a_{L_{i}-1}\) 在 \(rp\) 下合法,或值 \(\ge a_{R_{i}+1}\) 且 \(a_{R_{i}+1}\) 合法,则 \(i\) 在 \(rp\) 处合法(这也是为什么要按值从小到大做)
先考虑 \(a_{L_{i}-1}\)
当 \(L_i=1\)(即 \(a_i\) 为前缀最大值),则右端点取 \([i,R_i]\) 时 \(a_i\) 为全局最大值,可得 \([rL_i,rR_i]\supseteq ([i,n]\cap [i,R_i])\)(即令答案区间并上 \([i,n]\cap [i,R_i]\))
否则 \(a_{L_{i}-1}\) 存在,若 \(\sum_{j=L_{i}}^{i}a_j\ge a_{L_i-1}\),则从 \(i\) 开始向左合并到 \(a_{L_i-1}\) 为止,右端点在 \(L_i-1\) 对应的取值范围中是 \(a_{L_i-1}\) 可行,\(a_i\) 可行,可得 \([rL_i,rR_i]\supseteq ([i,n]\cap [rL_{L_i-1},rR_{L_i-1}])\)
若 \(\sum_{j=L_{i}}^{i}a_j< a_{L_i-1}\),则还要向右合并一段后才能合并 \(a_{L_i-1}\),则二分出最小的 \(m\in(i,R_i]\) 使得 \(\sum_{j=L_i}^m a_j\ge a_{L_i-1}\),可得 \([rL_i,rR_i]\supseteq ([i,n]\cap [rL_{L_i-1},rR_{L_i-1}]\cap[m,n])\)
然后考虑 \(a_{R_i+1}\)
当 \(R_i=n\) 时显然没有合法右端点,当 \(R_i<n\) 时,若 \(\sum_{j=L_i}^{R_i}a_j\ge a_{R_i+1}\) 则可向右合并,\(a_i\) 合法要求右端点不小于 \(R_i+1\),且 \(a_{R_i+1}\) 合法,即 \([rL_i,rR_i]\supseteq([R_i+1,n]\cap[rL_{R_i+1},rR_{R_i+1}])\)
时间复杂度 \(O(n\log n)\)

浙公网安备 33010602011771号