专栏文章

P11381

个人记录参与者 1已保存评论 0

文章操作

快速查看文章及其快照的属性,并进行相关操作。

当前评论
0 条
当前快照
1 份
快照标识符
@miq2jui7
此快照首次捕获于
2025/12/03 21:54
3 个月前
此快照最后确认于
2025/12/03 21:54
3 个月前
查看原文

题意

给定一个 DAG,每个点有 aabb 两个权值,保证 aa 互补相同,bb 互不相同,有 qq 次操作为以下三种:
  • 交换 ax,aya_x,a_y
  • 交换 bx,byb_x,b_y
  • 给定 x,l,rx,l,r,求所有 yy 满足 xx 可以到达 ttat[l,r]a_t\in[l,r]ttbtb_t 的最小值。没有 tt 满足条件则输出 00
n,q105,ai,bin,m2×105n,q\leq 10^5,a_i,b_i\leq n,m\leq 2\times 10^5
6s,2G\color{red}6\text{s},2\text{G}

思路

考虑 l=rl=r 且只有 33 操作的情况是 DAG 可达性判断,所以不会低于 O(nmω)O(\frac{nm}\omega),时空限制也体现了这一点;带修求区间内的最大值也无法和 ω\omega 数据结构很好的结合,所以考虑定期重构,考虑每 BO(n)B\approx O(\sqrt n) 次操作重构。现在问题变成两个部分:会修改的 tt 和不会修改的 tt
会修改的 tt 只有 O(B)O(B) 个,那么维护每个点能到的这类点的 bitset,可以做到 O(qBmBω)=O(qmω)O(\frac{q}{B}\frac{mB}{\omega})=O(\frac{qm}{\omega})。修改显然可以 O(1)O(1) 处理,每次询问的时候枚举这些点判断是否可行,可以做到 O(qB)O(qB)
对于不会修改的 tt,维护每个点的答案有点困难,所以考虑只计算被询问到的点,这样的点也有 O(B)O(B) 个。使用 bitset 求出每个点是否能被这些点到达的复杂度也是 O(qmω)O(\frac{qm}{\omega}) 的。为了解决 aa 在一个区间内的限制,从小往大枚举 aa 时动态维护当前的 aa 满足了哪些询问的限制的 bitset,这可以做到 O(qBn)O(\frac{q}{B}n)。最后枚举 v:n1v:n\to 1,维护答案 v\geq v 的询问,每次当 bitset 改变时更新,这是 O(qB(nBω+B2))=O(qnω+qB)O(\frac{q}{B}(\frac{nB}{\omega}+B^2))=O(\frac{qn}{\omega}+qB) 的。
最终总复杂度为 O(qm+qnω+qB+qBn)O(\frac{qm+qn}{\omega}+qB+\frac{q}{B}n) 的,理论上来说 BBO(n)O(\sqrt n) 时最快,但是我们发现 O(qn)O(q\sqrt n) 的速度远比 O(qmω)O(\frac{qm}{\omega}) 快,而 bitset 在大小更大时相对较快(有更小的常数)且 O(qBn)O(\frac{q}{B}n) 常数较大,所以可以把 BB 开到很大。我的考场代码开了 B=104B=10^{\color{red}4}

评论

0 条评论,欢迎与作者交流。

正在加载评论...