构造交互随机化乱做(阶段一)
P8210 [THUPC 2022 初赛] 造计算机
排除不需要排序的情况,发现至少需要两个额外的位置。猜测两个额外的位置为最优解。
考虑排列的每一个置换环,设置换环上的数分别为 \(A_1,A_2,\cdots,A_k\),下标分别为 \(P_1,P_2,\cdots,P_k\),如果没有同一对数只能交换一次的限制,我们使用一个额外位置与 \(P_1,P_2,\cdots\) 依次交换即可。 考虑这个限制,我们不妨留下后面两个数 \(A_{k-1},A_k\),设那两个额外位置分别为 \(n+1,n+2\),则数 \(n+1\) 在 \(P_1\) 上,数 \(A_{k-1}\) 在 \(P_k\) 上,数 \(A_k\) 在 \(n+1\) 上。考虑如下操作:\((P_k,n+2),(P_1,n+2),(P_k,n+1)\),这样我们就能合法的排序了,此时 \(n+1,n+2\) 位置会颠倒,等对所有置换环都做一遍后再 \((n+1,n+2)\) 即可。
CF1207E XOR Guessing
两次询问问 \([0,2^{14})\),考虑将数分为上 \(7\) 位和下 \(7\) 位,如果每一次询问都能问出其中一部分的值,那么这道题就做完了。假设我们要求下 \(7\) 位,由于 \(2^{7}=128>100\),所以总能凑出来 \(100\) 个下 \(7\) 位全为 \(0\) 的数,然后就能通过结果的下 \(7\) 位推算。
CF1054E Chips Puzzle
考虑到操作过于麻烦,所以考虑一些看起来更“条理”点的做法:设一个原始状态 \(O\),让初始圆台 \(S\) 先操作到达 \(O\),再让 \(O\) 操作到达最终状态 \(T\)。实际上这算是一种套路。我们考虑在 \(O\) 上让所有 0 聚集到某一个点(假设为 \((1,1)\)),让 1 聚集到另一个点(假设为 \((n,m)\)),那么以 0 为例,直接先列操作扔到第一行然后横操作扔到 \((1,1)\) 即可。有一些小细节,比如 \((1,1)\) 上的 0 由于需要让之后的 1 显露出来所以需要横操作随便把它扔到 \((1,i)\) 上,然后再把它扔回来。显然 \(S\rightarrow O,O\rightarrow T\) 每个 0/1 都分别只会移动 \(2\) 次,所以总次数不超过 \(4s\) 次。
CF468C Hack it!
脑筋急转弯。
考虑到数位的一个性质是 \(f(x+10^k)=f(x)+1\),其中 \(x<10^k\)。接着考虑 \(\sum_{i=1}^{10^{18}}f(i)\),假设它在模 \(a\) 意义下为 \(p\),那么 \(\sum_{i=2}^{10^{18}+1}f(i)=\sum_{i=2}^{10^{18}}f(i)+f(10^{18}+1)-f(1)=\sum_{i=1}^{10^{18}}f(i)+1\),那么只需要像这样移动 \(a-p\) 次就能完成构造,由于 \(a\le 10^{18}\),所以移动步数肯定不会超过 \(a\),所以上面的性质永远成立。
CF1404D Game of Pairs
乍一看不太好入手,考虑到 \(i,i+n\) 模 \(n\) 意义下同余,所以如果 \(i,i+n\) 同组的话,最终结果模 \(n\) 的答案确定,为 \(\frac{n(n+1)}{2}\)。当 \(n\) 为偶数时,\(\frac{n+1}{2}\) 不为整数,故该数不为 \(n\) 的倍数,亦不为 \(2n\) 的倍数,所以如此构造先手必胜。考虑 \(n\) 为奇数的时候,\(\frac{n(n+1)}{2}\) 为 \(n\) 的倍数,大胆猜测后手必胜。首先需要知道一个事实:一定存在一种方案使得模 \(n\) 意义下结果为 \(0\sim n-1\) 都选了一遍,此时其为 \(n\) 的倍数,但不一定为 \(2n\) 的倍数。证明考虑建图,\((i,i+n)\) 建一条边,在同一集合的两个点建一条边,此时原图会形成若干个偶环,而选数就相当于选最大独立集,此时无论怎么选都满足上面说的那个性质和题目条件;考虑随便将一个环分为两个独立集(这两个独立集大小相等),那么选一个 \(>n\) 的数就能改变模 \(2n\) 的结果(显然要么为 \(0\) 要么为 \(n\))。如果独立集的大小为偶数,那么两个独立集提供的“变化量”(即 \(>n\) 的数的数量的奇偶性)相同,不会引起余数的改变;而由于 \(n\) 是奇数,所以必定存在一个置换环的独立集大小为奇数,此时两个独立集提供的变化量一定不同,先让其他的置换环随便选,在根据此时的余数选择取该置换环的那一个独立集。这样通过建图构造证明了 \(n\) 为奇数后手必胜。
CF1365G Secure Password
有点人类智慧了。
发现或运算的基本性质是多次取或答案不变,考虑二进制分组,枚举每一位,问出该位为 0 和 1 的或,那么 0 那拨数的答案整体或上 1 的或,1 那拨数同理,正确性源于其他位置必定存在一个位和本身不同,所以不存在算漏。
但是这需要 \(20\) 次询问,太多了。考虑一个更好的方案使得每一位我只需要问一次就可以不漏的计算答案。考虑到给了 \(13\) 次询问,我们让其中 \(6\) 个位为 1,剩下 \(7\) 个位为 0,以其作为新的编号,然后对于每一位只需要问出该位为 0 的所有数的异或,根据编号方式可得出其他编号必定存在一个位使得其在该位上为 0 而本身在该位上为 1(反过来也是成立的)。由于 \(\binom{13}{6}=1716>1000\),所以编号足够用。
CF1562F Tubular Bells
考虑到如果我们找到一个素数 \(p\) 满足 \(p\in [l,r]\land 2p>r\),那么这道题就做完了。毛估估一下满足条件的数的密度大概是 \(\frac{1}{2\ln n}\) 级别的。暂且不考虑质数的合法性,只考虑它是不是质数,考虑随机选出 \(200\) 个数,则里面大概有 \(10\) 左右个质数。素性测试考虑再随机 \(25\) 个数,将这 \(25\) 个数与要 check 的数的 lcm 取 gcd,则 gcd 有大约 \(2^{-25}\) 的概率不为要 check 的数,如果这个 gcd 为质数,那么视为判定成功。
现在考虑质数的合法性。考虑到所有质数里面如果大于 \(\frac{r}{2}\) 那就合法,而所有质数都小于等于 \(\frac{r}{2}\) 的概率小于等于 \(2^{-10}\),所以我们取最大的那个质数就行。
但考虑到如果 \(n\) 足够小的话可能找不到合法的质数,此时 \(n\) 的长度一定不会大于 \(100\),直接跑 \(O(n^2)\) 暴力即可,具体做法就是考虑 \(O(n^2)\) 次询问问出任意一对数的 lcm,然后 lcm 最大的那一对就是最大值和次大值,然后用哈希或者直接比较的方式分离出最大值和次大值,然后在剩下的数中找到和次大值的 lcm 为 次大值*三大值 的另一个数,该数就是三大值,以此类推就能找到所有的数,询问次数不超过 \(4950\),多余的 \(5000\) 次够用。
P6892 [ICPC 2014 WF] Baggage
先分析一下下界,最终有 \(2n-2\) 个相邻的数相同的数对,而最初有 \(0\) 个,每次操作第一次对数对数有 \(1\) 的贡献,之后的操作最多有 \(2\) 的贡献,故至少需要 \(n\) 次操作。猜测最小步数就是这个下界,考虑如下局面:
..BABABABABABABABABABABA
将第一个 B 编号为 1,设字符数量为 \(m=2n\),将 \(m-2\) 开头的那两个数放到 -1 上,将 2 开头的那两个数放到 \(m-2\) 上:
ABBA..BABABABABABABABBAA
发现 \([3,m-4]\) 这段区间 ..BABABABABABABA 是一个相同的规模为 \(n-4\) 的子问题,那么就可以递归求解了。假设我们解决的这个子问题:
ABBAAAAAAAABBBBBBB..BBAA
将 0 开头的那两个数放到 \(m-5\) 上,将最后那两个数放到 0 上:
AAAAAAAAAAABBBBBBBBBBB..
问题解决。我们用 \(4\) 次操作将问题规模缩小了 \(4\),如果 \(4|n\),那么操作次数就是 \(n\)。但在其他情况,\(n\) 最终会缩为 \(1,2,3\),\(1,2\) 根本做不了。考虑让它们在 \(n=5,6,7\) 时就停止往下递归,此时爆搜可以发现这种情况下也只需要 \(n\) 次操作和 \(2\) 个空位就能做完。还有一个特殊情况 \(n=3\),此时需要 \(4\) 个空格才能做到 \(n\) 次操作。综上最小操作次数就是 \(n\)。
CF1364E X-OR
如果知道了 0 的位置,那么 \(n-1\) 次操作就能得出答案。假设我们有办法得出一个数的具体值(但是调用次数不能过多),考虑从前往后扫,假设有一个候选点 \(p\),它的值为 \(r\),对于一个数 \(i\),如果 ask(i,p) 的结果为 \(r\),那么说明 \(a_i\) 在二进制上是 \(r\) 的子集,有可能成为 0,将候选点改为 \(i\),\(r\) 该为这个数的具体值,否则 \(a_i\) 一定不是 0。由于只有 \(11\) 个二进制位,初始 popcount 至多为 \(11\),而每次改变候选点都会使 popcount 至少减少 1,所以至多执行 \(12\) 次“查询具体值”的操作。假设得出一个数的具体值的代价为 \(K\),则总代价为 \(2n-2+12K\)。而查询具体值可以直接随机 \(K\) 个数,并将这 \(K\) 个数和 \(i\) 的或结果取与,该做法出错当且仅当 \(a_i\) 该位为 0 而随机出的 \(K\) 个数该位都为 1,概率为 \(2^{-K}\),取 \(K=14\) 则足以保证正确率和总代价。保证不了也没关系,存在若干卡常方式,比如当 \(\text{popcount}(r)=1\) 时如果要改变候选点那么新 \(r\) 一定是 0,此时可以省掉一个 \(K\),\(K\) 可以提升为 \(15\);更厉害的卡常可以直接打乱排列,那么初始 popcount 很难卡满上界,每次减少的 popcount 也很难卡到最小,那么 \(K\) 可以提升到 \(20\) 甚至更多。
CF835E The penguin's game
算是来了道比较简单的。像这种找数的一般可以考虑二分或二进制分组,二分显然不好做,考虑二进制分组,假设两个 \(y\) 位置为 \(p,q\),我们能找到 \(p,q\) 值不同的二进制位,只需要询问某一位下为 1 的所有数是否只有一个 \(y\) 即可。拎出其中一位(设为 \(r\)),钦定 \(p\) 在这位上为 0,\(q\) 为 1,对于其它位,询问该位和 \(r\) 位上都为 1 的所有数是否包含 1 即可,可以据此以及 \(p,q\) 在这一位上的异同推断出 \(p,q\) 在这一位上的值。由于第二次询问不需要询问 \(r\) 位,所以总次数 \(10+9=19\) 次。
P4733 [BalticOI 2015] Tug of War
这题一眼看上去是一道二分图最小权匹配问题(人是左部点,位置是右部点),但是不大好做。但是发现左部点的度数恒为 2,考虑让人作为边,位置作为点,让边和点匹配。首先对于一个连通块必须有边数>点数,不难发现对于一个环,环内的点和边刚好能形成两种完美匹配,且匹配的权值相反。如果有两个环,那两个环匹配完后连接两个环的链无法完美匹配,所以有两个环就无解,那么有解当且仅当图是一张基环树森林。对于基环树的树部分,权值已经确定,钦定环部分选其中一种方案,然后考虑每个环是否选另一种方案。设 \(f_i\) 表示权值为 \(i\) 的可行性,转移显然可以 bitset 优化,最终只需要判断 \([-k,k]\) 之间有没有可行的点即可。复杂度 \(O(\frac{n^2s}{\omega})\),可能需要一定的卡常。
P5473 [NOI2019] I 君的探险
抽象题目。让点的编号从 \(1\) 开始。
发现整个题大致可以划分成三档分:
- \(n\le 500,L_m\ge n-1,L_q\ge \frac{n(n-1)}{2},L_c=2m\)
- 性质 A+B,\(L_c=0\)
- 无特殊性质,\(L_m\le 10^7,L_q\le 10^7,L_c=2m\)
第一档分最好做,直接按顺序操作 \(1\sim n-1\),对于一个点 \(j\),如果操作 \(i\) 后 query 的结果改变,那么 \((i,j)\) 间一定有边相连。20 pts
第二档分,考虑到这两个性质的相同之处在于对于一个点 \(i\),有至多一个点 \(j\) 满足 \(j<i\) 且 \((i,j)\) 有连边。观察 \(L_m=L_q=n\log n\),考虑一个带 log 的做法(这里注意二进制分组只能做 A 性质),考虑二分,初始二分范围是 \([1,i)\),将当前范围前一半染黑,如果查询结果为 1 那么 \(j\) 就在前一半,否则就在后一半。虽然对 \(n\) 个数都二分一遍是 \(n^2\log n\) 的,但是我们可以整体二分,总次数是 \(n\log n\)。当然可能不存在 \(j\),这样我们只需要将 \([1,i)\) 全染黑然后查询 \(i\) 就能得出是否存在 \(j\) 了。初始对所有 \(i\) 都做一遍,需要额外的 \(2n\) 次修改和 \(n\) 次查询,当然这过不去。但是发现这额外的 \(2n\) 次修改和 \(n\) 次查询是可以省掉的,因为如果不存在 \(j\),最终二分出来的 \(j\) 就是 \(i\) 本身,所以只需要判断 \(j\neq i\) 就行。24 pts
第三档分,此时如果 \(j\) 有奇数个,那么二分一定能找到一个合法的 \(j\);但如果 \(j\) 有偶数个,在极端情况下可能找不到 \(j\)(每次两边都是偶数个)。但是我们可以随机打乱编号,这样二分的时候就很难找不到 \(j\) 了(注意此时 \(j<i\) 的限制也应该改成重标号后的 \(j'<i'\))。然后发现如果单个点的度数很大那么总操作次数就会退化到 \(n^2\log n\) 级别,发现被晾在一边的 check 操作终于派上用场了,找到一条边后 check 一下边的两个端点,之后做整体二分只对 check 失败的点做即可。总操作次数【反正能过】。
CF2110E Melody
简单题。发现需要让每种声音出现恰好一次,直接考虑欧拉回路,将每种声音视为一条边,让声音的音色和音高之间连无向边,发现此时“‘音色相等’和‘音高相等’交替出现的”条件天然满足。时间复杂度单 log,瓶颈在离散化。
QOJ5434 Binary Substrings
类似于 P6892,考虑先分析一下上界,对于长度为 \(i\) 的子串,它的种类数至多为 \(\min(n-i+1,2^i)\),故上界就是 \(\sum_{i=1}^n \min(2^i,n-i+1)\)。接下来尝试通过构造取到上界。
找到最大的 \(k\) 满足 \(2^k\le n-k+1\),则构造的字符串需要满足:长度为 \(k\) 的子串都出现过,长度为 \(k+1\) 的子串两两不同。考虑对每个长度为 \(k\) 的串建点,两个点之间的转移的边就是长度为 \(k+1\) 的串,现在我们要求每个点至少经过一遍,且每条边至多经过一遍。假设我们已经找到了一个哈密顿回路,那么将这个回路上的边删掉,剩下的连通块都有欧拉回路,这样我们先走到回路上的一个点,然后走删掉回路上的边后该点所属连通块的欧拉回路,最后回到该点,然后沿着回路走到下一个点。路途中可能走着走着就填满 \(n\) 个字符了,这时候直接在此处停止即可,并将回路上该点和该点下一个点之间的边断开,并钦定该点为走到的最后一个点。找一个哈密顿回路直接让 \(k-1\) 子串为点 \(k\) 子串为边跑欧拉回路即可,由于欧拉回路必然存在所以哈密顿回路必然存在。
P9139 [THUPC 2023 初赛] 喵了个喵 II
如果每个数只出现两次,设该数对应的区间为 \([第一次出现位置,第二次出现位置]\),那么有解当且仅当没有两个区间有包含关系,此时将第一次出现位置划到 1 内,第二次出现位置划到 2 内。如果每个数出现了四次,那么我们现在把它划分为两部分,去重后只有以下几种情况 1122,1221,1212。第二种情况由于已经包含可以直接排除,现在每种数只有两种情况,考虑 2-SAT,限制形式就是区间包含形式,可以主席树优化建图。复杂度大常数单 log。
AGC018F Two Trees
还有人类吗?????
首先考虑到每个子树和都是奇数,那么如果一个点在两棵树内的儿子数量奇偶性不同,那么一定无解。对于剩下的情况,大胆猜测一定有解,不妨再大胆一些,猜测所有的 \(X_i\in\{-1,0,1\}\)。将两个根节点连接起来,那么,节点的度数和儿子数的奇偶性必然不同。如果儿子数量为奇数,那么 \(X_i=0\)。否则,我们该考虑 \(X_i\) 该填 \(1\) 还是 \(-1\)。看起来很像 2-SAT,但难以写出限制,故放弃,考虑欧拉回路,将儿子数量为偶数的点在两树之间连起来,根据欧拉回路中该边的指向判断 \(X_i\) 的取值,由于此时所有点都是偶度点,所以必然存在欧拉回路。正确性在于某个点的子树内和子树外之间的连边有偶数条,其中必然有一条连向的它的父亲(根节点由于被人为连接所以也算有了父亲),而由于是回路,所以走入和走出次数都相等,去掉连向父亲的那条边,走入和走出次数必然差出了 1,所以子树和绝对值必然为 1。复杂度线性。
QOJ8726 [APIO2024] 魔术表演
两种做法,一种是考虑二进制拆分,拿出两个点,将剩下的点分成 \(60\) 个部分,如果 \(X\) 在这一位为 1 则这一部分内的点全往第一个点连边,否则全往第二个点连边。为了不让交互库把一个部分内的点的连边全删光,考虑随机划分,这样全删光的概率会大大降低。
但是这一做法不仅有错误风险用途还很有限。考虑拿出 \(i\) 的父亲 \(fa_i<i\),那么一棵树相当于传递一个长为 \(n-1\) 的序列,然后删掉 \(\lfloor\frac{n}{2}\rfloor\) 个位置上的元素。考虑记录 \(fa_i=X\bmod (i-1)+1\),excrt 出来 \(X\) 即可。具体实现可以不用 excrt,因为模数只有 \(5000\),暴力跳即可,实际能做的范围远不止 \(10^{18}\)。
QOJ9327 [IOI2024] 消息篡改者
年度反人类题。由于它没告诉 Bob S 的值,为了统一 S,将 M 补上一段序列,该序列除了第一个元素之外都为 0,使得 M 的长度为 1025。这样,从最后一个 1 开始往后的所有元素都删掉即可。
先介绍几个部分分。由于 0 的个数大于 1,所以我们直接让 31 个数全传一个字符,找到绝对众数就可以知道传的什么,能过第一个包。
这样做太逊了,考虑让这个准确传递信息的机会用来求出所有 0 的位置,需要 30 次操作(最后一个可以推出来),然后让这 16 个 0 传递信息,需要 \(30+65=95\) 次操作,有大约 30 分。
一个创造性的想法是,如果我们找到了其中一个 0 的位置,我们让这个位置传递其他 0 的位置,剩下的位置继续传递信息,由于调用不是在线的,求出 0 的位置后在把之前在上面的询问拿出来就行,需要 \(5+30+\frac{1025-30\times15}{16}=71\) 次操作,有大约 79 分。
一个小优化是将 31 个数划分为 \(B\) 个块,鸽巢原理可知至少存在一个块 0 数量多于 1,那么第一个 1 肯定出现在前一半里,总共 \(\log_2 B+\log_2 \frac{n}{2B}\) 次操作,取 \(B=4\) 能让找第一个 0 的操作数减 1,有大约 83 分。
最终的正解跟上面的做法基本没有关系。考虑对于每个 0,若钦定序列形成一个环(即钦定 31 的下一个是 1)向它的下一个 0 连一条边,1 连了谁不管,那么最终会形成一个内向基环树森林,且存在一个基环大小为 16。在每一位上用 5 次操作存下它的下一个 0 的位置在每一个二进制位上的值,这样所有 0 上的信息都不会丢失,然后再用 65 次操作传递信息即可,需要 \(5+65=70\) 次操作,虽然分数没变但是离正解更近了一步。
注意到所有 0 距离它的下一个 0 的距离总和为 31,每一位上都用 5 次操作存太浪费了,考虑如果距离它的下一个 0 距离为 \(d\),那么在这一位上从前往后存 \(d-1\) 个 0 和 1 个 1,用 1 的出现位置代表 \(d\),此时用掉 \(31\) 个比特,然后第一个 1 出现后就正常开始传递信息,注意每个位上传递的信息数大概率会不同,总共要发出 \(1025+31=1056\) 个 bit,需要 \(\frac{1056}{16}=66\) 次操作,通过此题。
QOJ6669 Mapa
如果暴力传 \(x,y\) 需要 \(2n\log V\) 个 bit,但是注意到每次查询实际上给出了 \(x_i\),考虑将 \((x_i,y_i)\) 视为多项式的一个点值然后做拉插,这样只需要存多项式的 \(n\) 个系数即可,需要 \(n\log V\) 个 bit。
QOJ67 Two Transportations
考虑模拟 dijkstra 的过程,但是直接模拟比特数是 \(O(m\log V)\) 级别的,就爆了,但是 \(n\) 就 2000,考虑每次暴力枚举每个点边权最小的出边,然后找到最终最短路最小的点,然后更新它,这样在 A 和 B 之间来回传 A 图和 B 图内的最短路大小和最短路节点编号就是 \(2n(\log n+\log V)\) 个比特,不能通过。但是考虑到不是最短路的编号没有用,我们考虑先让 A 传 A 图最短路,等算出 B 图最短路大小后,如果 B 图最短路更小,那么将最短路和编号都传 A;否则只传最短路,并且让下一轮 A 再传给 B 编号。这样就是 \(n(2\log V+\log n)\) 个比特,刚好 58000,可以通过。
P10831 [COTS 2023] 三角形 Trokuti
将每条边的出现状态视为未知数,将查询的结果视为方程,那么高斯消元解这个方程即可,由于矩阵稀疏,所以能跑 \(5000\)。为了使矩阵尽可能满秩,可能需要一些不低明的随机手段。
考虑增量构造,假设有了前 \(i-1\) 个点的子图,现在要往里面加入 \(i\)。假设查询 \(i,x,y\),其中 \(x,y<i\),那么由于知道了 \((x,y)\) 的存在性,可以推出 \((i,x),(i,y)\) 的存在性之和。如果该值为 \(0\) 或 \(2\),那么两条边的存在性确定。否则,能推出两条边存在性不同,然后将这两个点缩点,把它当做一个点在接着做,直到确定了其中一条边的存在性。最终可能剩下一个点(其中包含若干个点),如果存在存在性已知的边,那么让这条边的端点和剩下的其中一个点查询,也能推出剩余的边的存在性;如果不存在,那么说明奇偶性相同的点存在性相同,随便问一组即可。由于 \(\frac{1}{2}\) 的概率一次删掉两条边,\(\frac{1}{2}\) 的概率两次删掉两条边,所以期望 \(\frac{2}{3}n\) 次操作删掉所有边,可以通过。为了减少常数,可以尝试打乱编号,并且为了避免大量分类讨论,在 \(i\) 较小时套用高斯消元解法,需要保证 \(\binom{i}{3}>\binom{i}{2}\)。
3rducup semifinal G Master of Cards
CF547D 的加强版(CF547D 是这题的二维版本)。
问题提升到三维后,发现不能像二维一样直接横坐标向纵坐标连边了。但没有关系,我们可以让三个维度之间两两连边,形成三条边,分别对应三张牌。不难发现新图的每个连通块都有欧拉回路,跑一遍欧拉回路然后相邻的两条边匹配就行了,每个连通块最多只会剩下一条边没有匹配。有一个结论是必定存在一种边不重复匹配的最优解,证明可以考虑调整法。并且这种连边方式下同种牌之间天然可以互相匹配,于是这道题就做完了。复杂度是欧拉回路的线性。
CF527E Data Center Drama
看到入度和出度都为偶数,那么自然度数也一定是偶数,那么图有解的一个必要条件是存在欧拉回路。先把奇度点连成偶度点,那么此时图有解的充要条件是 \(m\) 为偶数,如果不是偶数那么随便加一个自环即可。跑解的话,直接让第奇数条边的方向和欧拉回路经过的方向相同,第偶数条边相反即可。复杂度还是欧拉回路的线性。
CF2135D From the Unknown
首先一个直觉上的想法是询问 \(10^5\) 个 \(1\),然后可以得出 \(\lceil\frac{10^5}{W}\rceil\) 的值。根据 \(W,\lceil\frac{10^5}{W}\rceil\) 的值可以推出 \(W\) 的取值范围 \([L,R]\)(式子没那么简单,就不写了),并且发现一个重要性质是 \(2L>R\)(因为 \(\lceil\frac{n}{2L}\rceil<\lceil\frac{n}{L}\rceil\)),这启发我们构造 \(L,1,L,2,L,3,\cdots,L,R-L\) 来不断试探 \(n\),显然在 \(L\) 和后面某个数加起来大于 \(n\) 时后面的数一行一个,前面的数一行两个,据此可以推出 \(n\),解决 easy ver。
考虑 hard ver,发现用 \(1\) 询问实在是太浪费了,考虑用 \(N\) 个 \(B\) 做询问,然后得出 \(\lceil\frac{N}{\lfloor\frac{W}{B}\rfloor}\rceil\),同样能得出 \(W\) 的取值范围 \(L,R\)(比 easy ver 更复杂),并且依然满足 \(2L>R\)。注意由于可以 \(W<B\),所以为了区分比 \(B\) 小的数,可以在第二轮塞入 \(N\) 个 \(1\),需要满足 \(i<B\) 时 \(\lceil\frac{N}{i}\rceil\) 互不相同。写个程序枚举一下 \(N,B\) 的值就能找到一组合法的解 \(N=9507,B=107\)。
QOJ10168 Dota 322 for Droids
奈特我可艾若大蛇爆标了,把 \(a_i\) 干到了 \(725\)。
显然传出的顺序可以当作传出的值,也就是说能传 \([1,120]\)。考虑抠掉哪一个,我们不妨抠掉下标为 \(p=sum \bmod 6\) 的那个数,然后令 \(a'_p\leftarrow a_p-p\),注意到 \(\frac{725}{6}=120\),我们可以考虑传出 \(\lceil\frac{a'_i}{6}\rceil\) 的值。接收的时候根据给出的五个数和传出的数的六倍的和模 6 的值得出 \(a'_p\) 的值,有一个厉害的结论是此时可能的排名只有恰好一个,枚举排名 check 即可。
CF2150E Hidden Single
不难想到将序列分成两部分,然后对每个数都询问是否在这两部分之中,如果同时在这两部分之中,那么这个数就没用了;否则,一定全在两部分之一当中。将每一部分的大小减去同时在两部分当中的数量,那么答案肯定在剩余大小为奇数的那一部分当中,递归进去,我们有一个集合 \(S\) 表示两个数都在这一部分之中的数,\(T\) 表示只有一个数在这一部分之中的数。\(S\) 还是照常做,\(T\) 只需要询问一部分即可。如果两部分平均分,这样会递归 \(O(\log n)\) 层,总代价能推出是 \(4n+\lceil\log_2 2n\rceil\),怎么推有时间就填坑。
然后考虑优化。显然我们可以直接暴力套上随机化,但是优化并不明显(只能优化到 \(1100\sim 1200\) 次左右)。考虑另一种暴力,我们随机选出一半的点,然后询问一个数是否同时在这两半当中,是那么此数不可能成为答案,否则递归进去。这个做法更劣一些,但是我们不妨考虑结合一下两个做法,对第一轮做 E1 的做法,做完一轮后会剩下大约 \(\frac{n}{4}\) 个候选答案和 \(\frac{n}{2}\) 个候选位置,对剩下这些做后面的那个做法,总次数在 \(800\sim 900\) 之间,可以通过。次数证明有机会再补。

浙公网安备 33010602011771号