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}\),则构造映射:

\[x_i\mapsto p_{2i}\;(0\le i\le\tfrac{n-1}2)\\ x_{\frac{n+1}2+i}\mapsto p_{n-2-2i}\;(0\le i\le \tfrac{n-3}2) \]

此时要么新产生一个自环,要么环长减去 \(2\) 并产生一个长为 \(2\) 的环,前者相当于奇环已经产生贡献了,因此最优情况下交互库会选后者,即最大环大小减 \(2\),操作若干次后环长变为 \(n\) 从而产生 \(1\) 的贡献,显然这样最优

若大小 \(<n\),则先从大到小并上偶环,若仍然不足 \(n\) 则从大到小并上奇环,直到凑够 \(n\) 个点,显然最优

总操作次数不超过 \(n\) 次,足够使用

然后考虑偶环的情况(即 \(n\) 为偶数)

定义合并环 \(A\) 和环 \(B\)(区别于从一个环开始合并)为从 \(A\) 中选出长不超过 \(n-1\) 的一段弧,在 \(B\) 中补足剩余长度,对这一序列进行操作(需要满足两者长度之和不小于 \(n\)

按顺序进行以下操作:

  1. 若存在长为 \(n\) 的环,则直接从上面拆下一个自环
  2. 若存在两个环总长为 \(n\) 则把两者合并
  3. 若最大环大小为 \(n-1\) 且次大环大小为 \(n-1\),则把两者合并
  4. 若最大环大小为 \(n-1\),且次大环和第三大环总长为 \(n+1\),则合并最大环和第三大环
  5. 若最大环大小为 \(n-1\),且除了最大环外所有环总长不小于 \(n\),则从次大环开始合并,直到大小不小于 \(n\)
  6. 若最大环大小 \(<n\),则从最大环开始合并,直到大小不小于 \(n\)
  7. 若最大环大小为 \(n+1\),则将其和次大环合并
  8. 若最大环大小不小于 \(\frac32n\),则从中拆出 \(n\) 个点:
  9. 若最大环大小不为 \(n+2\)\(n+4\),则从中拆出 \(3\) 个点
  10. 否则从最大环中拆出两个点

设最大环为 \(p_{0\sim n-1}\),则从中拆出 \(n\) 个点的映射为:

\[x_i\mapsto p_i\;(0\le i<\tfrac n2)\\ x_{i+\frac n2}\mapsto p_{\frac 32n-1-i}\;(0\le i<\tfrac n2) \]

拆出三个点的映射为:

\[x_i\mapsto p_{2i}\;(0\le i<\tfrac n2)\\ x_{i+\frac n2}\mapsto p_{n-1-2i}\;(0\le i<\tfrac n2) \]

拆出两个点的映射根据 \(n\bmod 6\) 分为三类:

\(n\bmod 6=0\) 时:

\[\begin{aligned} x_{0\sim n-1}\mapsto &p_0,p_1,\\ &(p_2,p_5,\cdots,p_{n-1}),\\ &([p_{n-2},p_{n-3},p_{n-6},p_{n-5}],[p_{n-8},p_{n-9},p_{n-12},p_{n-11}],\cdots,[p_{10},p_9,p_6,p_5]),\\ &p_4,p_3 \end{aligned} \]

\(n\bmod 6=2\) 时:

\[\begin{aligned} x_{0\sim n-1}\mapsto &p_0,\\ &(p_1,p_4,\cdots,p_{n-1}),\\ &([p_{n-2},p_{n-3},p_{n-6},p_{n-5}],[p_{n-8},p_{n-9},p_{n-12},p_{n-11}],\cdots,[p_{12},p_{11},p_8,p_7]),\\ &p_6,p_5,p_2,p_3 \end{aligned} \]

\(n\bmod 6=4\) 时:

\[\begin{aligned} x_{0\sim n-1}\mapsto &(p_0,p_3,\cdots,p_{n-1}),\\ &([p_{n-2},p_{n-3},p_{n-6},p_{n-5}],[p_{n-8},p_{n-9},p_{n-12},p_{n-11}],\cdots,[p_8,p_7,p_4,p_3]),\\ &p_2,p_1 \end{aligned} \]

可证操作次数不超过 \(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)\)

代码

posted @ 2025-05-21 07:49  Hstry  阅读(15)  评论(0)    收藏  举报