fst 掉大分了...
B. Kevin and Geometry
由于这题赛后被叉了,就放上来了。
题意
给定 \(n\) 个数,选出 \(4\) 个数组成一个等腰梯形。
题解
等腰梯形要求腰的两倍加上下底的最小值大于最大值。
对数组排序,枚举哪个数作为腰,接着选出去掉这两个腰后差最小的两个数即可,设当前选的腰为 \(a_i,a_{i+1}\) ,考虑选择 \(a_{1\cdots i-1}\) 中的两个数,\(a_{i+2 \cdots n}\) 中的两个数,以及 \(a_{i-1},a_{i+2}\) 。前两个用前后缀预处理一下。
关于 \(a_{i-1},a_{i+2}\) ,比如 \(1,2,2,3\) 这种的,pretest 没有这种数据,你这 pretest 是什么东西?????
参考实现
E. Kevin and And
题意
给 \(n\) 个数 \(a_n\) 和 \(m\) 个数 \(b_m\),一次操作可以选择 \(i \leq n, j\leq m\),使 \(a_i=a_i \And b_j\) ,最多操作 \(k\) 次,使得最后的 \(\sum a_i\) 最小。
\(m \leq 10\)。
题解
先求出对于每个 \(a_i\) ,操作 \(k\) 次后能变成的最小值是多少,注意有个错误的贪心做法:第 \(k\) 次的最小值是第 \(k-1\) 次的最小值再选一个数,比如 \(a=1111,b=[1010,0101,0011]\) 。因此我们需要枚举 \(b\) 的所有组合,设为 \(f_{i,k}\) 。
有个结论:\(f_{i}\) 是凸的,感性理解一下:每次多选择一个数操作时,限制总是更严格的。
于是我们像堆模拟搜索那样,选前 \(k\) 个让差最大的操作就行了,由于 \(f_i\) 是凸的,我们可以把所有的 \(f_{i,k}-f_{i,k+1}\) 丢进去,选前 \(k\) 大就行。
参考代码
G. Kevin and Teams
参考了官方题解。
真人类智慧,传奇 ioi 出题组恐怖如斯。
题意
给定 \(n\) ,求出最大的 \(k\) ,使得对于任意 \(n\) 个点组成的无向图,总存在 \(k\) 对互不相同的点 \((a_1,b_1),(a_2,b_2) \cdots (a_k,b_k)\) ,使得所有的 \((a_i,b_i)\) 要不都有连边要不都没有连边。
求出 \(k\) 后,你需要进行交互,交互库有一个隐藏的无向图,你可以问 \(n\) 次两个点是否有连边,并构造 \(k\) 对点出来。
交互库是自适应的。
题解
对于点 \(u,v,k\) ,若 \((u,v)\) 和 \((v,k)\) 的连通性不同,那我们把 \((u,v,k)\) 三元组拿下来,三个点中总有一对点满足 连边 或 不连边。
我们证明 \(k=\lfloor\frac{n+1}{3} \rfloor\) 。
证明上界,构造 \(2\times \lfloor\frac{n+1}{3} \rfloor + [n ~ mod ~ 3 =1]\) 个点的团,其余点不连任何边,达到上界。
下面构造的证明可行性:
我们维护一条链,链上相邻的点连边情况均相同,每次加入一个点时,若该点和链尾的连边情况和链相同,则将这个点加入链。否则,脱去从链尾数两个点,加上这个点构成一个三元组,注意若链长小于 \(2\) 要重新维护这条链。
最劣的情况是:最终链长小于 \(2\) ,此时至少能脱下 \(k\) 个三元组。
若链长大于等于 \(2\) ,则链的相邻点全部组合起来,加上脱下的三元组,也总有 \(k\) 对点满足题意。
参考代码
别的题在赶来的路上。