2025.3.1-3.2 NOIWC
Day 1
\(8:30\) 开始考试
先开 \(\operatorname {T1}\)。一开始看错顺序,把 \(B\) 性质当做给定值和数量的范围求中位数,打完后发现样例不对。之后写了 \(20\) 分暴力,前面错误的代码倒是用上了。猜测可能答案为一个区间,但是不太确定,时间还有很多,因此先开了后面的题
\(\operatorname{T2}\) 感觉像数据结构题,从数据范围看时空应该是 \(O(\frac{n^2}\omega)\) 级别的,暂时没有想法,因此也只打了 \(20\) 分暴力
再开 \(\operatorname{T3}\),同样先写了最低一档 \(8\) 分的暴力
突然想到可以把 \(a_i,b_i\) 看做一个区间,对 \(a,b\) 的限制相当于各个区间只能包含或相离,\(p\) 类似于遍历图的顺序。转化为给每个点定遍历顺序,优先遍历到编号小的点,将图拍平到数轴上,位置 \(x\) 对应第 \(x\) 个遍历到的点,要求图中左右边都不相交(即要么相离要么包含)。对于树的情况似乎只要 \(p\) 为一种 \(dfn\) 就可以不相交。写完发现没法过。想了一下发现不止有 \(dfn\) 可以,例如对于一条链 \(1-2-3\),像 \(p=\{1,3,2\}\) 这种也可以,画到数轴上相当于把一段子树翻折过了。写完 \(O(n^2)\) 的过了样例,又想了一下优化到 \(O(n)\),于是过了性质 \(AC\),又拿了 \(24\) 分
以为森林的做法就是对各个连通块排序,突然想到可以互相嵌套,先处理出每个连通块的序列,然后尽量将它们嵌套或连接,使字典序最小,可以做到 \(O(n)\),但是最终没有调出来
此时大约还有半个小时,回头实现 \(\operatorname{T1}\) 的猜测,分别二分出左右边界,然后二分里的判定就是简单贪心。写完之后测了一下,小样例没问题,但是一部分大样例答案偏大。突然想到答案不是二分得到的区间长度,而是二分得到的区间中可能出现的数字的数量,于是修改一下,大约剩 \(15\) 分钟时过了大样例
最后 \(15\) 分钟尝试去调 \(\operatorname {T3}\),没什么进展,最后五分钟还是常规检查了一下,在剩一分钟时才写完字节数确认表,\(13:00\) 比赛结束
预计 \(100+20+32\),感觉发挥还可以,但是策略还需要改进
晚上去看了一下洛谷,发现 \(\operatorname{T1}\) 居然是蓝题。一道蓝题卡我到最后半个小时,感觉平时刷题还是太少
T1 幸运数字
给定 \(l_{i,1},r_{i,1},l_{i,2},r_{i,2}\;(1\le i\le n)\),已知 \(l_{i,1}\le a_i\le r_{i,1}\),\(l_{i,2}\le b_i\le r_{i,2}\),求 \(n\) 组 \(a_i\) 个 \(b_i\) 组成的可重集的中位数取值数量,\(n\le2\times10^5\),\(r_{i,1},r_{i,2}\le10^9\),多测 \(\sum n\le6\times10^5\)
令 \(lp\) 为可能得到的最小中位数,\(rp\) 为可能得到的最大中位数,则答案为 \(|\mathbb N\cap [lp,rp]\cap\left(\bigcap_{i=1}^n [l_{i,2},r_{i,2}]\right)|\),得到 \(lp,rp\) 后容易 \(O(n\log n)\) 算出
考虑计算 \(lp,rp\),发现具有单调性,因此二分。对于 \(lp\),转化为判断中位数能否小于等于给定值 \(M\),要令 \(\le M\) 的数尽量多,\(>M\) 的尽量少,因此令 \(l_{i,2}>M\) 的取 \(l_{i,1}\),其余取值 \(\le M\) 且数量取 \(r_{i,1}\) 即可。\(rp\) 类似
时间复杂度 \(O(n\log V)\)
T2 追忆
给定一张 \(n\) 点的 \(\operatorname {DAG}\),\(a_{1\sim n}\) 和 \(b_{1\sim n}\) 为两个排列,\(q\) 次操作,交换 \(a\) 中两个位置的值,交换 \(b\) 中两个位置的值,或给定 \(x,l,r\) 求 \(\max_{i=1}^n [l\le a_i\le r][x\to i]b_i\),其中 \(x\to i\) 表示 \(\operatorname{DAG}\) 上 \(x\) 可以到达 \(i\),\(n,q\le10^5,m\le2\times10^5\),多测 \(T\le 3\),\(6s\),\(2G\)
从时空限制可以推测时间复杂度大约在 \(O(\frac{n^2}\omega)\) 级别(假定 \(n,m,q\) 同阶)
预处理 \(to_{i,j}\),表示 \(i\) 能否到达 \(j\),使用 bitset 存储,时间复杂度 \(O(\frac{nm}\omega)\),空间复杂度 \(O(\frac{n^2}\omega)\)
然后考虑求出 \(\{p\mid l\le a_p\le r\}\) 的 bitset
其可差分为 \(\{p\mid a_p\ge l\}\) 和 \(\{p\mid a_p\ge r+1\}\) 的差(即 bitset 的异或)
值域分块,设块长为 \(S\),则维护 \(O(\frac nS)\) 个 bitset,第 \(i\) 个等于 \(\{p\mid a_p\ge iS\}\),预处理时空复杂度 \(O(\frac{n^2}{S\omega})\)
查询可整块直接使用、散块暴力加入,时间复杂度 \(O(S+\frac n\omega)\)
交换 \(x,y\) 位置相当于令 \(a_x\) 所属块(不含)到 \(a_y\) 所属块的 \(x,y\) 位置都翻转(假定 \(a_x<a_y\)),时间复杂度为 \(O(\frac nS)\)
问题转化为已知集合 \(S\),求出 \(\max_{i\in S}b_i\)
对 \(b\) 进行同样的值域分块,记第 \(i\) 个块的 bitset 为 \(b_i\),扫描每个存储单元(即底层实现中的 unsigned long long 或 unsigned 数组,\(B\) 的第 \(i\) 个单元记为 \(B[i]\),可能需要手写 bitset),令 \(p\) 为 仅考虑当前已经扫描的存储单元,满足 \(b_p\) 和 \(S\) 有交的最大值,扫到一个新的存储单元时则尝试增加 \(p\) 直到无法增加或结束为止,最后在得到的块中暴力查询即可,这样单次时间复杂度为 \(O(\frac n\omega+\frac nS+S)\)
总时间复杂度 \(O(\frac{nm}\omega+\frac{n^2}{B\omega}+q(\frac{n}\omega+\frac nS+S))\),空间复杂度 \(O(\frac{n^2}\omega)\),取 \(S=\sqrt n\) 可到 \(O(\frac{n(m+\sqrt n+q)}\omega+q\sqrt n)\)
T3 图排列
给定一张 \(n\) 点 \(m\) 边的无向图,构造字典序最小的排列 \(p_{1\sim n}\),使得存在 \(a_{1\sim m}\) 和 \(b_{1\sim m}\),满足 \(\{(p_{a_i},p_{b_i})\mid 1\le i\le m\}\) 等于边集,且 \((\nexists 1\le i,j\le m),a_i<a_j<b_i<b_j\),\(n\le10^5,0\le m\le2n\),保证有解
相当于给结点设定顺序,将点按顺序映射到数轴上后,对 \(a,b\) 的限制相当于没有两条边相交(即要么相离要么相包含)
连通块之间互相独立,因此求出每个连通块的序列后合并在一起(任意两个序列之间可以并列,也可以一个序列在另一个序列相邻数之间的空隙中),容易 \(O(n)\) 实现
先考虑 \(C\) 性质
考虑如何求出一棵树的序列
显然每个子树在序列中对应一个连续段,否则必然相交
对于一个结点,它本身,它的每个儿子对应子树的序列,这些部分之间必须并列
因此对原树 \(\operatorname{dfs}\),子树向父亲合并时,父亲将其各个部分按第一个数字排序后拼接即可
时间复杂度 \(O(n\log n)\),可得到 \(44\) 分
再考虑一般情况,若将每个边双缩为一个点则变为森林的情况,因此问题转化为求出一个边双的序列
对于一个边双,若其一个子图同胚于 \(K4\),则无法找到满足要求的序列,而题目保证一定有解,因此任意一个边双所有子图都不同胚于 \(K4\)(即广义串并联图),发现此时按边双的哈密顿回路遍历即可满足要求
通过 CF1656I Neighbour Ordering 的方式计算即可
总时间复杂度 \(O(n\log n)\),应该可以做到线性
Day 2
晚上谈人生到凌晨,导致有点困
\(8:30\) 开始考试,\(\operatorname{T1}\) 从扫描线的角度思考,没有想法,于是去看 \(\operatorname{T2}\)
写了 \(\operatorname{T2}\) 的暴力,过了特殊性质 \(A\)
特殊性质 \(B\) 相当于原图最小生成树的边在新图上都被保留,于是转化为给定一棵生成树,求有多少种连有向边的方法使得其可变为外向树,可以状压解决
然后去看 \(\operatorname{T3}\),发现答案不超过 \(O(2^nnm)\),于是写了 \(\~O(ans)\) 的做法,尝试写出 \(n\le 18\) 加 \(AB\) 性质的但没调出来
回来想 \(\operatorname{T1}\),发现 \(A\) 性质只要 \(\sum |a_i-b_i|\le t\) 即可,于是拿了 \(16\) 分。之后又做出 \(B\) 性质,但是没有向按 \(t\) 排序的方面想。之后还是思考如何扫描的过程中贪心维护,写了一份过了 \(C\) 性质。然后发现一般情况只要把 \(a_i>b_i\) 的极长连续段翻转过来即可转化为 \(C\) 性质,写完之后测一下,发现有一个不对。调了一会发现是 \(C\) 性质部分的代码有问题,此时还有半个小时。很快想到了 \(\operatorname{hack}\)。最后十五分钟似乎想到了正解,但来不及了,于是只能放弃,回去检查后两题
最终估计 \(36+24+16\),应该比较靠后了
原本以为 \(\operatorname{T1}\) 能有紫,结果还是蓝。现在是蓝题都不会了
感觉策略上还是有问题
T1 推箱子
有 \(n\) 个物体分别在 \(a_{1\sim n}\),第 \(i\) 个物品要在 \(t_i\) 秒时到达 \(b_i\),且之后不再移动,每一秒可以选择一个物品向左或向右移动一个单位长度,任何时刻物品不能重叠,判断能否实现,\(n\le2\times10^5\),多测 \(T\le6\),\(a\) 和 \(b\) 单调递增,\(1\le a_i,b_i\le10^9\),\(1\le t_i\le10^{16}\)
对于存在 \(a_i>b_i\) 的情况,令 \([l,r]\) 为满足 \(a_i>b_i\) 的一个极长连续段,则可令这个区间关于 \(x=\frac12(b_l+a_r)\) 翻转(\(a\) 和 \(b\) 坐标翻转,区间整体 reverse)转化为 \(a_i\le b_i\) 的情况,可证两者答案相同
因此只考虑 \(a_i\le b_i\) 的情况
可证优先移动 \(t\) 更小的一定不劣,且无解当且仅当存在一个人移到终点之前所有人的总移动步数之和大于他的时限
因此可以暴力模拟移动的过程,时间复杂度 \(O(n^2)\)
令 \(a_i\gets a_i-i\),\(b_i\gets b_i-i\),则可转化为找到一个值在 \([a_i,b_i]\) 内的极大子段,全部赋值为 \(b_i\),可以用 \(\operatorname{ODT}\) 维护
时间复杂度 \(O(n\log n)\)
T2 岁月
T3 封印
3.7 upd: 没有挂,和预期一致

浙公网安备 33010602011771号