|
|
题目大意:给出一个 $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}$)。
题目4116 [统一省选 2025]追忆
AAAAAAAAAAAAAAAAAAAAAAAAA
2
评论
2025-10-22 22:09:18
|