2025.5.19 APIO
\(10:00\) 开始
先看 \(\text T1\),先暴力枚举得到 \(8pts\),后来发现对于 \(1\le n\le10^6\) 查询 \(\{1,2,\cdots,10^6\}\) 的结果互不相同,于是得到 \(10^6\) 次查询的算法,但是发现交互库单次询问时间复杂度为 \(O(|S|\log |S|)\) 的,若 \(20\) 组数据的话询问次数没问题,但交互库会 \(\text {TLE}\),但是过了 \(\text{selfeval}\),就以为实际实现为线性的
看了一下 \(\text T2\) 没什么想法,于是去看 \(\text T3\),\(n=2\) 是容易的,得到 \(5pts\),之后发现 \(v_i<25000\) 时分为两半互相垂直最优,于是得到 \(11pts\)
回去看 \(\text T2\),先转化为图论问题,发现对于 \(m=2\) 的情况相当于对排列排序,得到 \(6pts\),排列 \(p\) 可拆为若干环,当 \(e>m\) 时必然存在操作使得孤点数量不增,因此最优解为不操作,得到 \(6pts\)
之后发现若存在度数 \(>2\) 的点则与 \(e>m\) 的情况相同,因此对于 \(e=m-1\) 的情况相当于考虑链,调整了将近 \(2h\),在 \(\text{selfeval}\) 上交了 \(30\) 多发后拿下 \(10pts\),推到三元环上,得到 \(24pts\)
此时剩余约半小时,之后尝试冲 \(\text T2\) \(70pts\) 未果
最后预估 \(25+46+16=87pts\),复评时 \(\text T1\) 的 \(17pts\) 挂了,应该是之前猜测的原因,但最终成绩上加回来了,拿 \(\text{Cu}\)
难度 \(\text T2>\text T1>\text T3\)
T1 [APIO2025] Hack!
存在一个 \([1,10^9]\) 内的 \(n\),每次询问可以给定一个集合 \(S\),\(S\) 内元素 \(\bmod n\) 意义下划分为等价类 \(S_{0\sim n-1}\),交互库返回 \(\sum_i \binom{|S_i|}2\),要求出 \(n\),所有询问的 \(\sum|S|\) 不能超过 \(110000\),\(S\) 内元素不超过 \(10^{18}\)
若要判断一个数 \(x\) 是否为 \(n\) 的倍数,则查询 \(\{1,x+1\}\),若返回值不等于 \(0\) 则是 \(n\) 的倍数,代价为 \(2\)
假设已经找到一个 \(n'\) 为答案的倍数,设 \(n'\) 的质因数分解为 \(\prod_i p_i^{r_i}\),则可以对于每个 \(p_i\) 二分实际答案的质数,代价为 \(2\times \sum_i \lceil\log_2 (r_i+1)\rceil\),当 \(n'\in[1,10^9]\) 时值不超过 \(24\),\(n'=901800900=2^2\times3^2\times5^2\times7^2\times11^2\times13^2\) 时取到最大
因此问题转化求出任意合法的 \(n'\)
假设存在集合 \(A\) 使得查询 \(A\) 的结果不为 \(0\),则一定存在 \(u,v\in A,u\ne v\) 使得 \(|u-v|\) 为答案的倍数,即 \(n'\) 可取 \(|u-v|\)
考虑分治,把 \(A\) 划分为 \(S\) 和 \(T\)
则 \(u,v\) 要么全在 \(S\) 中,要么全在 \(T\) 中,要么一个在 \(S\) 中一个在 \(T\) 中,前两种情况通过查询 \(S\) 和 \(T\) 判断,转化为子问题,考虑如何处理最后一种情况,假设 \(u\in S\) 且 \(v\in T\),此时 \(S\) 和 \(T\) 的查询结果都是 \(0\)
\(|S|=1\) 或 \(|T|=1\) 是平凡的
将 \(S\) 划分为 \(S_1\) 和 \(S_2\),\(T\) 划分为 \(T_1\) 和 \(T_2\),先查询 \(S\cup T_1\) 以判断 \(v\) 在 \(T_1\) 中还是 \(T_2\) 中,设 \(v\) 在 \(T_\ast\) 中,则之后查询 \(S_1\cup T_\ast\) 以判断 \(u\) 在 \(S_1\) 中还是 \(S_2\) 中
假设 \(|S_1|,|S_2|\le \left\lceil\frac{|S|}2\right\rceil\),\(T\) 同理,则以不超过 \(|S|+\lfloor\frac{|T|}2\rfloor+\lfloor\frac{|S|}2\rfloor+\lfloor\frac{|T|}2\rfloor\le \frac 32|S|+|T|\) 的代价将 \(S\) 和 \(T\) 的大小减半(向上取整),要求出 \(u,v\) 总代价不超过 \(3|S|+2|T|\)
构造 \(S=\{1,2,\cdots,a\},T=\{5\times10^8+a,5\times10^8+2a,\cdots,5\times10^8+ba\}\),其中 \(ab>5\times10^8,a<b\),则 \(|u-v|\mid u,v\in (S\cup T)\) 取遍 \([5\times10^8,10^9]\),\(n\) 必然存在一个倍数在此范围内,因此必然可以从 \(S\cup T\) 中选出 \(u,v\)
若 \(S\) 中存在一组 \((u,v)\) 使得 \(|u-v|\) 为答案的倍数,则 \(T\) 中必然也存在
若 \(S\) 和 \(T\) 内部不存在 \(u,v\),则使用上述二分的方式,代价不超过 \(3a+2b\)
否则只要从 \(T\) 中找,发现 \(\{|u-v|\}=\{a,2a,\cdots,(b-1)a\}\),暴力检查即可,代价不超过 \(2b\)
考虑如何判断是否存在 \(u,v\in T\) 使得 \(n\mid |u-v|\),查询 \(\{1,2,\cdots,p\}\cup\{\frac {b}2+p,\frac {b}2+2p,\cdots,\frac {b}2+p^2\}\) 即可,其中 \(p^2>\frac {b}2\),代价不超过 \(2\left\lceil\sqrt\frac{b}2\right\rceil+2\)
总代价不超过 \(2\left\lceil\sqrt\frac{b}2\right\rceil+2+3a+2b+24\),当 \(a = 18174, b = 27512\) 时上限为 \(109808\)
时间复杂度应该不超过交互复杂度
上述过程只需要判断交互的结果是否为 \(0\),利用上具体数值可能能做到更优的交互次数
T2 [APIO2025] Permutation Game
给定一张 \(m\) 点 \(e\) 边的无向连通图,从 \(0\) 开始编号,第 \(i\) 条边为 \((u_i,v_i)\),给定排列 \(p_{0\sim n-1}\;(m\le n)\),定义排列的值为其中 \(p_i=i\) 的数量,要和交互库博弈,你可以选择停止或给出一个序列 \(t_{0\sim m-1}\)(\(t_i\in[0,n)\),\(t_i\) 两两不同),交互库会给出一个 \(j\in[0,e)\),表示交换 \(p_{t_{u_j}}\) 和 \(p_{t_{v_j}}\),你要使排列的值最大,交互库要使之最小,假设双方都用最优策略,求出当前局面所能到达的排列的值的最大值,并与交互库进行游戏(有可能对方的策略不是最优的,此时你需要保证最终的值不劣于理论值),要求操作次数不超过 \(3m\),\(m\le n\le400,m-1\le e\le 400\)
以下用 \(n\) 表示题面中的 \(m\),\(m\) 表示题面中的 \(e\),\(lp\) 表示题面中的 \(n\),与代码一致
对于排列 \(p\),建立图 \(P\),其中 \(i\to p_i\),设原本的图为 \(G\)
以下假定自环不是环,因此 \(P\) 由自环和环构成
则题意相当于每次给出一个 \(G\) 中结点到 \(P\) 中结点的单射,交互库选择 \(G\) 中的一条边,交换 \(P\) 中映射到的两个点
对于一组映射 \(t\),虚拟地建立一张 \(n\) 点的图 \(K\),对于 \(G\) 中的边 \((u,v)\),若 \(p_{t_v}=t_u\) 则连边 \(u\to v\),则原图的一条无向边可能对应 \(0/1/2\) 条有向边,显然 \(K\) 中每个点度数至多为 \(2\),若 \(G\) 中存在一个点度数超过 \(2\),则这个点的邻边中必然有一条不在 \(K\) 中,交互库每次选择这条边,排列的值一定不升,因此对于存在度数 \(>2\) 的点的图,不操作最优
度数 \(\le2\) 的连通图只有环和链两种形态
先考虑链的情况
设链上的点为 \(x_{0\sim n-1}\),分别映射到 \(P\) 中的 \(p_{0\sim n-1}\),则最优情况为 \(p\) 可划分为若干连续段,每个连续段对应 \(P\) 中一个环上的一段连续的弧,不同区间对应不同的环
此时交互库选择的边要么在两个环之间,要么为一个环上的一条边,前者相当于把两个环合并,后者相当于将一个点从环上脱离形成一个新的自环
显然这样最优,答案为 \(n-m+1\)(对初始值取 \(\max\),下同),最后只剩下一个长为 \(m-1\) 的环
然后考虑图环的情况,设环上的点为 \(x_{0\sim n-1}\),分为奇环和偶环,先考虑奇环(即 \(n\) 为奇数)
奇环可以拆为一个奇环和一个偶环,而可证拆分偶环时交互库一定存在方法使得拆出的两个环都是偶环,从一个奇环上反复取出偶环至多得到一个自环,因此一个奇环贡献至多为 \(1\),偶环贡献为 \(0\)
设此时 \(P\) 中奇环的集合为 \(odd\),偶环的集合为 \(even\),两者按大小排序,取出最大奇环(若只有偶环则结束)
若其大小为 \(n\),设点分别为 \(p_{0\sim n-1}\),则 \(x_i\) 映射到 \(p_i\),必然产生一个自环
若大小 \(>n\),设环上一段长为 \(n\) 的弧为 \(p_{0\sim n-1}\),则构造映射:
此时要么新产生一个自环,要么环长减去 \(2\) 并产生一个长为 \(2\) 的环,前者相当于奇环已经产生贡献了,因此最优情况下交互库会选后者,即最大环大小减 \(2\),操作若干次后环长变为 \(n\) 从而产生 \(1\) 的贡献,显然这样最优
若大小 \(<n\),则先从大到小并上偶环,若仍然不足 \(n\) 则从大到小并上奇环,直到凑够 \(n\) 个点,显然最优
总操作次数不超过 \(n\) 次,足够使用
然后考虑偶环的情况(即 \(n\) 为偶数)
定义合并环 \(A\) 和环 \(B\)(区别于从一个环开始合并)为从 \(A\) 中选出长不超过 \(n-1\) 的一段弧,在 \(B\) 中补足剩余长度,对这一序列进行操作(需要满足两者长度之和不小于 \(n\))
按顺序进行以下操作:
- 若存在长为 \(n\) 的环,则直接从上面拆下一个自环
- 若存在两个环总长为 \(n\) 则把两者合并
- 若最大环大小为 \(n-1\) 且次大环大小为 \(n-1\),则把两者合并
- 若最大环大小为 \(n-1\),且次大环和第三大环总长为 \(n+1\),则合并最大环和第三大环
- 若最大环大小为 \(n-1\),且除了最大环外所有环总长不小于 \(n\),则从次大环开始合并,直到大小不小于 \(n\)
- 若最大环大小 \(<n\),则从最大环开始合并,直到大小不小于 \(n\)
- 若最大环大小为 \(n+1\),则将其和次大环合并
- 若最大环大小不小于 \(\frac32n\),则从中拆出 \(n\) 个点:
- 若最大环大小不为 \(n+2\) 和 \(n+4\),则从中拆出 \(3\) 个点
- 否则从最大环中拆出两个点
设最大环为 \(p_{0\sim n-1}\),则从中拆出 \(n\) 个点的映射为:
拆出三个点的映射为:
拆出两个点的映射根据 \(n\bmod 6\) 分为三类:
\(n\bmod 6=0\) 时:
\(n\bmod 6=2\) 时:
\(n\bmod 6=4\) 时:
可证操作次数不超过 \(3n\)
T3 [APIO2025] Rotating Lines
有 \(v_{0\sim n-1}\),每次操作可以选择下标集合 \(S\subseteq\{0,1,\cdots,n-1\}\) 和 \(x\),令 \(v_i\gets v_i+x\),其中 \(v_i\in\mathbb Z_{50000}\),令 \(\text V(v_{0\sim n-1})=\sum_{0\le i<j<n}\min(|v_i-v_j|,50000-|v_i-v_j|)\),要求每次操作后 \(\text V(v)\) 不降,且所有操作后 \(\text V(v)\) 取到从初始状态能到达的最大值,构造方案,\(n\le10^5\),要求所有操作的 \(\sum |S|\le2\times10^6\)
相当于有一个长为 \(50000\) 的环,上面有 \(n\) 个点,每次可以向某一方向整体旋转点的一个子集,要求价值不降,其中价值定义为点两两之间的距离和,其中环上两点之间的距离定义为从环的两侧移动的较小值
若存在两个点分别在 \(x,y\) 且 \(x+y=50000\)(即两者过圆心对称),称两者为匹配的,两者之间的贡献为 \(25000\) 取到最大,对于任意的 \(z\),\(x,z\) 与 \(y,z\) 的贡献之和为 \(50000\) 取到最大,此时 \(x,y\) 对其他点的贡献为定值且取到最大,若之后不再移动两者(显然移动两者一定不优),则可把两者删除
至多一个点没有匹配时,代价最大,为 \(25000\times\lfloor\frac n2\rfloor\times\lceil\frac n2\rceil\),用调整法证明:
假设已经删除的所有匹配的点,且目前还有超过一个点,取出其中任意一个,设位置为 \(x\),令 \(lf\) 为 \([x-25000,x]\) 中剩余点的数量,\(rt\) 为 \([x,x+25000]\) 中剩余点的数量,当 \(lf<rt\) 时 \(x\) 只能向左旋转以使 \(\text V(v)\) 不降,反之向右旋转
旋转过程中若 \(x\) 跨越的一个点,则点数少的一侧点数更少,点数多的一侧点数更多,即旋转方向不变
若存在与 \(x\) 匹配的点则停止,显然必然会停止
这也是答案的构造方法,暴力实现为 \(O(n^2)\) 的,容易数据结构优化到 \(O(n\log n)\)

浙公网安备 33010602011771号