【XSY4371】star(构造)
题意:
给定值域在 \([0,n-1]\) 的序列 \(a_1,\cdots,a_{m}\),要求构造值域在 \([0,n-1]\) 的序列 \(b_1,\cdots,b_{m}\) 和 \(c_1,\cdots,c_{m}\),使得 \(b_i\) 两两不同、\(c_i\) 两两不同、且 \(\forall i,b_i+c_i\equiv a_i\pmod n\)。
\(n\leq 10^5\)。
题解:
首先说明有解的充要条件:
- 若 \(m<n\),则一定有解;
- 若 \(m=n\),则有解当且仅当 \(\sum a_i\equiv 0\pmod n\)。
必要性显然。下面的构造性算法将会说明充分性:
考虑逐位构造并调整。假设 \(a\) 序列的前 \(i\) 位已经有了对应的 \(b,c\),现在需要构造 \(a_i\)。
对于 \(i<n\) 时,可以选出两个未在 \(b\) 中出现的数字 \(x,y\),构造 \((a_i,x,y)\):令 \(b_i=x,c_i=a_i-x\)。
此时若 \(c_i\) 未出现过则构造成功。若 \(c_i\) 已经出现过了,假设出现在了 \(c_j\),那么我们递归构造 \((a_j,y,b_j)\)。
整个过程如左图所示。
可以证明过程中不会出现循环情况:若出现了,如右图,则必有 \(\begin{cases}t_1+v_3\equiv a_{j_1}\equiv t_2+v_2\\t_2+v_4\equiv a_{j_2}\equiv t_3+v_3\\t_3+v_5\equiv a_{j_3}\equiv t_1+v_4\end{cases}\to v_2=v_5\),矛盾。
所以对于 \(i<n\) 的情况我们一定可以构造成功。而对于 \(i=n\) 的情况,发现只要满足 \(\sum a_i\equiv 0\pmod n\) 那么剩下的 \(b_n,c_n\) 一定满足要求。
我们先将 \(a_i\) 随机打乱。那么每次递归构造 \((a_i,x,y)\) 的时候,扔进来的 \(x\) 实际上可以看做是一个随机数,那么对应的 \(c_i=a_i-x\) 没有出现过的概率为 \(\frac{n-i+1}{n}\),于是对于 \(i\) 构造的期望递归次数为 \(\frac{n}{n-i+1}\)。那么总时间复杂度期望为 \(O(n\log n)\)。