Gravatar
李金泽
积分:320
提交:23 / 45

Pro4116  [统一省选 2025]追忆

题目大意:给出一个 $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}$)。






2025-10-22 22:09:18    
我有话要说
暂无人分享评论!