做题记录 25.7.30

\(\textcolor{blue}\odot\) CF1637F Towers

\(h\) 最大的点 \(rt\) 为根,则它需要有至少两个子树内存在势能 \(\ge h_{rt}\) 的点,对于所有 \(x\ne rt\),只需要子树 \(x\) 内存在势能 \(\ge h_x\) 的点即可(路径另一端取 \(rt\) 另一子树内势能 \(\ge h_{rt}\) 的点即符合要求)

从下向上处理,记录每个子树内势能的最大值,处理到结点 \(x\) 时,若 \(x=rt\) 则从它的所有儿子中选择所在子树最大值最大的两个,都增加至 \(\ge h_x\),否则选择一个增加至 \(h_x\) 并跟新最大值

时间复杂度 \(O(n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1634F Fibonacci Additions

维护 \(c=a-b\),则 \(a=b\) 当且仅当 \(\forall i,c_i=0\)

\(d_i=c_i-c_{i-1}-c_{i-1}\),则 \(c\)\([l,r]\) 加斐波那契等价于 \(d_l\) 加一,\(d_{r+1}\) 减去 \(F_{r-l+2}\)\(d_{r+2}\) 减去 \(F_{r-l+1}\)(其中 \(F\) 为斐波那契数列)

\(c\)\(0\) 等价于 \(d\)\(0\),因此维护 \(d\)\(0\) 的数量即可

时间复杂度 \(O(n+q)\)

代码

\(\textcolor{purple}\odot\) CF1635F Closest Pair

\(L_i\)\(i\) 左侧第一个 \(w_p\le w_i\) 的位置 \(p\)\(R_i\)\(i\) 右侧第一个 \(w_p\le w_i\) 的位置 \(p\),则最优解一定为选择一个 \([L_i,i]\)\([i,R_i]\)

证明:

  • 假如选择的不是两类之一,设选择了 \([l,r]\)\(w_l\le w_r\)(若 \(w_l>w_r\) 则对称),且 \(l\ne L_r\),显然 \(l<L_r\),若 \(w_{L_r}\le w_l\) 则取 \([L_r,r]\),否则取 \([l,L_r]\) 并继续尝试即可,显然权值更小
  • 选择一个 \([L_i,i]\)\([i,R_i]\) 与之对称),显然对于任意 \(j\in (L_i,i)\)\([L_i,j]\)\([j,i]\) 都劣于 \([L_i,i]\)
  • 因此最优情况下选择的一定为 \([L_i,i]\)\([i,R_i]\)

剩余部分容易扫描线解决,时间复杂度 \(O((n+q)\log n)\)

代码

参考

\(\textcolor{purple}\odot\) CF1648D Serious Business

\(a,b,c\) 为三行的前缀和,\(Q\) 为操作集合,\(f_i\) 为从 \((1,1)\) 走到 \((2,i)\) 的最大收益,则答案为 \(\max_{i=1}^n (f_i+c_n-c_i)\),考虑如何求出 \(f_i\)

枚举最后一个区间 \((l,r,k)\),满足 \(l\le i\le r\),若第一行到第二行的转折点在当前区间以前,则

\[f_i\gets \max_{(l,r,k)\in Q,l\le i\le r}(f_{l-1}+b_i-b_{l-1}-k) \]

\(dp\) 过程中令 \(S\)\(\{f_{l-1}-b_{l-1}-k \mid (l,r,k)\in Q,l\le i\le r\}\),则转移为 \(f_i\gets \max S-b_i\),容易 \(O((n+q)\log n)\) 维护这部分

若转折点在当前区间中,则

\[f_i\gets \max_{(l,r,k)\in Q,l\le i\le r}\max_{l\le j\le i}(a_j+b_i-b_{j-1}-k) \]

\(v_x=\max_{(l,r,k)\in Q,l\le i\le r,l\le x\le r}(a_x-b_{x-1}-k)\),则 \(f_i\gets \max_{j=1}^i v_j+b_i\)

考虑对于每个位置 \(x\) 维护一个集合 \(K_x=\{k\mid (l,r,k)\in Q,l\le i\le r,l\le x\le r\}\),则需要维护三种操作:

  1. 区间内 \(K\) 插入一个数
  2. 区间内 \(K\) 删除一个数
  3. 求区间内 \(a_x-b_{x-1}-\min K_x\) 的最大值

使用标记永久化容易做到 \(O((n+q)\log^2 n)\)

显然将所有插入操作提到求 \(f\) 之前不会影响答案,此时按 \(k\) 从大到小的顺序插入,则每个结点上的 \(K\) 从大到小,vector 保存 \(K_x\),懒惰删除即可

总时间复杂度 \(O((n+q)\log n)\)

代码

参考

posted @ 2025-07-31 07:16  Hstry  阅读(6)  评论(0)    收藏  举报