做题记录 25.7.10

\(\textcolor{blue}\odot\) CF1693C Keshi in Search of AmShZ

\(f_u\) 表示 \(u\)\(n\) 的最小代价,显然 \(f_n=0\),答案为 \(f_1\),转移为

\[f_u=\min_{u\to v}\left(f_v+1+\sum_{u\to w}[f_w>f_v]\right) \]

使用类似 \(\text{dijkstra}\) 的方法,从小到大跟新 \(f\),类似拓扑排序记录剩余 \(deg\),则 \(\sum_{u\to w}[f_w>f_v]=deg\)(可能存在多个 \(f_v=f_w\) 的,即 \(\sum_{u\to w}[f_w>f_v]\) 可能多算,但一定存在一个 \(f_v=f_w\) 使得式子恰好正确,且不正确的会被 \(\min\) 消去,因此不用考虑)

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

代码

参考

\(\textcolor{purple}\odot\) CF1693D Decinc Dividing

区间合法当且仅当区间内不存在离散化后为 \(3\;4\;1\;2\)\(2\;1\;4\;3\) 的子序列,显然具有单调性,令 \(mr_l\) 表示最小的不合法右端点(即最小的 \(r\) 使得 \([l,r]\) 内存在形如 \(3\;4\;1\;2\)\(2\;1\;4\;3\) 的子序列)

只考虑 \(3\;4\;1\;2\) 的情况,对于 \(2\;1\;4\;3\) 的情况,值域翻转后 \(mr\)\(\min\) 即可

预处理 \(pmn_i\) 表示 \(i\) 之前第一个 \(<a_i\) 的位置,\(smx_i\) 表示 \(i\) 之后第一个 \(>a_i\) 的位置

\(n\)\(1\) 枚举 \(i\),树状数组 \(F\)\(p\) 位置保存 \(i\sim n\) 中最小的 \(q\) 满足 \([i,q]\) 中存在 \(1\;2\)\(2\) 的值 \(=p\),令 \(pm_s=\{i\mid pmn_i=s\}\)\(sm_s=\{i\mid smx_i=s\}\),则枚举 \(\in pm_i\)\(F_{a_s}\gets s\),然后枚举 \(s\in sm_i\)\(mr_s\gets \min F_{1\sim a_s-1}\),最终对 \(mr\) 做后缀 \(\min\)

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

代码

存在 \(O(n)\) 解法

参考

\(\textcolor{blue}\odot\) CF1691E Number of Groups

先将区间按右端点从小到大排序,然后依次枚举每个区间,两个栈分别保存两种颜色的区间形成的连续段,每段保存其第一个区间,并查集维护 \(n\) 个区间的连通性

每加入一个区间,若对应栈(即颜色与当前区间不同)顶与当前区间相交,则合并,否则结束并将当前区间作为新连通块加入对应颜色的栈中

时间复杂度 \(O(n\log n)\),瓶颈在于排序,容易做到 \(O(n\alpha(n)+n\log_n V)\)

代码

参考

\(\textcolor{purple}\odot\) CF1689E ANDfinity

当存在 \(a_i=0\) 时,显然操作 \(a_i\gets a_i+1\) 是必要的,因此考虑 \(\forall i,a_i\ne 0\) 的情况,此时至多只需要两次操作

证明:

  • \(P\)\(\text{lowbit}(a_i)\) 取到最大值的 \(i\) 的集合
  • 显然 \(|P|\ge 1\)
  • \(|P|=1\) 时,对应位置减一,显然满足条件
  • \(|P|\ge 2\) 时,任取两个,一个加一,一个减一,显然满足条件

因此特判 \(0\) 次操作的情况,枚举一次操作的 \(O(n)\) 种可能,分别 \(O(n\alpha(n)\log V)\) 判定,若都不合法,则按上述方式构造出两次操作的方案

总时间复杂度 \(O(n^2\alpha(n)\log V)\)

代码

参考

\(\textcolor{purple}\odot\) CF1687C Sanae and Giant Robot

\(c_i\gets a_i-b_i\),则转化为每次选择一个 \([l,r]\) 满足 \(\sum_{i=l}^r c_i=0\)\(\forall l\le i\le r,c_i\gets 0\),最终令所有 \(c_i\)\(=0\)

\(s_i=\sum_{j=1}^i c_j\),则转化为选择区间 \([l,r]\) 满足 \(s_{l-1}=s_r\)\(\forall l\le i\le r,s_i\gets s_{l-1}\),最终令所有 \(s_i\)\(=0\)

显然 \(s_{l-1}=s_r\ne 0\) 时不优,因此进一步转化为选择区间 \([l,r]\) 满足 \(s_{l-1}=s_r=0\)\(\forall l\le i\le r,s_i\gets 0\),最终令所有 \(s_i\)\(=0\)

set 保存 \(\ne 0\)\(s\) 的位置,每次取出一个未扩展过的 \(s_i=0\)\(i\),枚举 \(l=i\)\(r=i\) 的区间 \([l,r]\) 并尝试操作

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

代码

参考

\(\textcolor{purple}\odot\) CF1685C Bring Balance

\(h_i\)\(i\) 位置的括号嵌套深度

题目保证 \(h_{2n}=0\),显然 \(\forall i,h_i\ge 0\) 时序列合法,此时操作数为 \(0\)

否则,令 \(p\)\(h\) 的最小值所在位置,反翻转 \([1,p-1]\)\([p+1,2n]\) 一定合法,因此答案上限为 \(2\)

考虑何时答案可以为 \(1\)

可证区间 \([l,r]\) 满足 \(\forall l\le i\le r,h_i\le h_l+h_r\) 时,翻转区间 \([l,r]\) 会使得 \([l,r]\) 内的 \(h\)\(\ge 0\)

\(p_0\) 为第一个 \(<0\)\(h_i\) 的位置,\(p_m\) 为最后一个,显然最优情况下取 \(l\)\([0,p_0]\) 中的最大值的位置,\(r\)\([p_m,2n]\) 中的最大值的位置

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

代码

参考

posted @ 2025-07-11 08:07  Hstry  阅读(2)  评论(0)    收藏  举报