题目大意:给出一个 $n$ 点 $m$ 边的 DAG,每个点有两个权值 $a_i$,$b_i$.保证 $a, b$ 均为 $1\sim n$ 的排列。有三种操作:交换 $a_{x}$, $a_{y}$、交换 $b_{x}$, $b_{y}$、找数。
找数:给定x, l, r,找出最大的$b_{y}$满足x能到达y,l≤$a_{y}$≤r
数据范围:1≤n, q≤1e5,1≤m≤2e5,数据组数不超过3
解法思路:
本题核心为bitset的运用。
由DAG的连通性可知,最优时间复杂度不超过O($\frac{nm}{\omega}$),其中$\omega$=64,所以可以乱搞。
可以先用拓扑把能到达y的集合算出来,将可达性和范围限制取交集。
容易发现l≤$a_{y}$≤r可转换为$a_{y}$≥l和$a_{y}$≥r+1的异或值
现在考虑如何求$a_{y}$≥l
考虑分块,将$a_{y}$≥l分为$a_{y}$≥x·s和l≤$a_{y}$<x·s,其中x= ⌈$\frac{l}{s}$⌉ ,s=$\sqrt{n}$
设v[x]为$a_{y}$≥x·s的集合,可直接与l≤$a_{y}$<x·s部分取并。因为bitset比较单个元素时间复杂度为O(1),所以l≤$a_{y}$<x·s部分暴力计算即可
考虑修改v[x],设在交换$a_{x}$,$a_{y}$时$a_{x}$≤$a_{y}$,将所有满足$a_{x}$<x·s≤$a_{y}$的v[x]中删去$a_{x}$并加入$a_{y}$
将已经得到的合法y的集合设为B,求$b_{x}$的最大值。
容易想到把$b_{y}$也按值域分块,找到最大的l使$b_{y}$≥l的集合与B有交集
二分找时间复杂度接近O(nq),肯定不行。考虑找的过程中有什么性质。
容易发现l不断增大的过程中集合元素只减不增,因此前面比较结果不变(全0才会比较下一个ull块),所以可以保留前面的比较结果。找到答案所在块后再在块内暴力比较。
修改部分与v[x]一样。
这里的比较方式比较特殊,需要手写bitset。
时间复杂度O($\frac{n(m+q)}{\omega}+q\sqrt{n}$)。