20260921 构造 & 交互
https://vjudge.net/contest/850452
CF1882E1 Two Permutations (Easy Version)
当 \(n\) 是偶数的时候,操作一步逆序对奇偶性一定会变化。所以如果 \(n,m\) 都是偶数且初始逆序对奇偶性不相同就会构造失败。
而 \(n\) 是奇数的时候,操作一步逆序对奇偶性是否变化取决于 \(i\) 是不是偶数。
然后我们可以花费 3 次操作交换两个数,且逆序对一定变化奇偶性。
所以如果第一次构造出来两个排列答案的奇偶性不同,就对于奇数的一开始对 \(1\) 操作一次。
这样操作次数就是 \(3n\)。
P16325 XOR and Swap
由于是 \(2\times 2^n\),且操作可逆,所以可以考虑还原成单位排列的过程。
考虑置换环上的还原过程。
设 \(p_y=x\),我们希望交换 \(p_x,p_y\),这需要满足 \(p_x\oplus p_y\le x\oplus y\)。
带入 \(p_y=x\),得到 \(p_x\oplus x\le p_y\oplus y\),显然一个置换环上不可能全是 \(>\)。所以一定存在可以交换的位置。
用队列维护所有的下标,能交换就交换并加入其邻居。
CF1720E Misha and Paintings
颜色增加是好做的,每次找到一个不是只出现了一次的颜色,以及一个没有出现过的颜色,并进行单格替换。
对于颜色减少,有结论:答案不会超过 \(2\)。
考虑先找到一个 \((1,1)-(x,x)\) 的最大矩形,使得覆盖后颜色数不会小于 \(k\)。
然后覆盖 \((y,y)-(x+1,x+1)\),显然每次只会删除两个颜色,这样用覆盖的两个矩形来调整即可。
所以只用判定 \(ans=1\) 是否合法,枚举 \(len\) 后可以二维数点判定矩形完全包含的颜色数量。
CF1270G Subset with Zero Sum
限制可以转化为 \(1\le i-a_i \le n\),所以令 \(b_i=i-a_i\),我们希望找到 \(\sum_{i\in S} b_i=\sum_{i\in S} i\)。
容易发现可以 \(i\to b_i\) 然后找一个环。
CF804E The same permutation
交换次数 \(\frac{n(n-1)}{2}\),由于交换一次逆序对奇偶性发生改变,所以要求 \(\frac{n(n-1)}{2}\bmod 2=0\)。
也就是 \(n\bmod 4=0\) 或者 \(n\bmod 4=1\)。
对于 \(n=4\) 的情况,可以构造 \((1,2),(3,4),(1,4),(2,3),(1,3),(2,4)\)。
先考虑 \(n\bmod 4=0\)。那么按照 \(4\) 分块,块内这样操作。
然后任意两个块间的操作,考虑把边按照 \(i-j \bmod 4\) 分类,依次操作 \(0,3,1,2\) 类即可。
接着是 \(n\bmod 4=1\),尝试把 \((i,n)\) 的边在块内处理掉。
也就是 \(n=5\) 的构造,这里不写了可以直接爆搜出来一个吧。
CF715D Create a Maze
考虑一个 \(2\times 2\) 的格子,从左上角走到右下角会导致方案数乘 2,并且可以通过从上方或者左方引入路径使得方案数加 1。那么就可以构造所有的方案了。
但是 \(\bmod 2\) 有点超了,所以换成 \(\bmod 3\)。
QOJ9432 Permutation
先用 \(O(\log)\) 次操作求出 \(1\) 的位置,每次问候选集合的一个子集判定。
我们不想问到的位置就用 1 放置。这样就可以二分 \(i\) 的位置了,\(n\log n\) 次。
由于没有自适应,所以先 shuffle 一下询问的值的顺序,每次拉出两个值一起问。
这样期望 \(\frac{1}{2}\) 概率问 1 次,而 \(\frac{1}{2}\) 概率问 2 次,所以有 \(\frac{3}{4}\) 常数,应该能过。
QOJ15314 Menji,我们想你!
定一个根然后二分出深度。
令该深度的点为关键点,在上面做边分治二分。
次数是 \(\log_2 n+\log_{1.5} \frac{n}{2}=39.7\)。
CF2150E2 Hidden Single (Version 2)
先给序列 shuffle,然后对于每个值 \(v\) 问一次 \(ask([1,mid],v),ask([mid+1,n],v)\)。
如果两个都是 1 就说明不是我们要找的答案。
考虑这样做一次需要 \(2n\) 次操作,并期望 \(\frac{n}{2}\) 个值被求出来。
接着,丢掉被问出的值后,剩下区间长度为偶数的显然也不可能是答案。
所以还剩下 \(\frac{n}{4}\) 的值成为候选答案。
然后如果问前半部分没有问出来,那么一定在后半部分,这样的概率是 \(\frac{1}{4}\),可以减少一次操作。
没有问出来的值继续问下去,次数 \(f(n)=\frac{7}{4}n+f(\frac{n}{2})=\frac{7}{2}n\)。
初始 \(\frac{7}{4}n+f(\frac{n}{4})=\frac{21}{8}n\)。
差不多能过了。
CF1364E X-OR
找到 0 就可以 \(n-1\) 次得到排列是什么。
考虑维护二元组 \((x,y)\) 表示 \(x,y\) 中可能有一个是 0。
加入 \(i\)。
若 \(a_x|a_i= a_x|a_y\),则 \(x\) 不可能是 0,抛弃 \(x\),并询问 \(a_i|a_y\)。
否则 \(a_x|a_i\ne a_x|a_y\),这时候若 \(a_i\) 是 0,那么一定满足 \(a_x|a_i<a_x|a_y\),所以我们保留结果较小者。
由于排列是固定的,所以可以 shuffle 保证第一种个数不会很多。
然后怎么判定 \(x,y\) 中哪个是 0,可以随几个位置 \(i\) 检查 \(a_x|a_i,a_y|a_i\) 哪个小。
CF1764G3 Doremy's Perfect DS Class (Hard Version)
考虑到 \(k=2\) 的询问是有用的,相当于 \(2x,2x+1\) 分成一组。1 单独一组。
先考虑 \(n\) 是奇数,这样 \(n\) 和 \(n-1\) 分到一组。
如果我们询问 \(a=Q[1,mid,k],b=Q[mid+1,n,k]\),可以让两边区间长度都减去 2a,2b,这样剩下的是跨中点的匹配,这样哪边多 1 就代表了 1 在哪里。
询问次数 \(2\log n\)。
然后 \(n\) 是偶数怎么做。如果 \(1,n\) 在同侧,那么只用递归失配更多的那边。
但是如果两边失配数量相等,就说明 \(1,n\) 跨过两侧。这时候我们问一次 \(Q[1,mid,n]\) 即可判定 \(n\) 在哪里。
询问次数 \(2\log n+1\)。
考虑怎么优化一次。
考虑最后候选 \(mid\) 只有 \(x,x+1\) 怎么办。
如果 \(1,n\) 仍然没有分开,可以询问一次判定 \(n\) 在哪里。
否则,这个区间内是 \(1\) 和另外一个数。
先给询问记忆化一下,然后我们可以知道 \([1,x+1,2]-[1,x-1,2]\) 和 \([x+2,n,2]-[x,n,2]\)。
发现除了 \(1,n\),贡献都是同号的。对于 1 贡献是固定的 \(1,-1\),而另外一个数可能是 \(1,1\) 也可能是 \(-1,-1\)。
那么通过上面已知的四个询问可以知道另一个数的贡献符号,这样查询一次符号不同的一侧即可区分。
浙公网安备 33010602011771号