题目大意:给出一个n点m边的DAG,每个点有两个权值ai,bi.保证a, b均为1~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})。