2023.01.14 欧洲信息学竞赛题目选讲 学习笔记
讲课人:钟诚。
WC2023 Day2 下午的课。
来放放松。
1.QOJ#5430. Triangeltal
将所有 \(a_i\) 从小到大排序后,可以用调整法说明如果有解,存在一种取三段连续区间的解。假设选的三段分别是 \([1,x],[x+1,y],[y+1,n]\)。枚举 \(y\),一种情况是 \(a_x\le y-x,a_y\le n-y,a_n\le x\),可以发现 \(x=a_n\) 时最优;另一种情况是 \(a_x\le n-y,a_n\le y-x,a_y\le x\),可以发现 \(x=a_y\) 时最优。
时间复杂度 \(O(n)\),空间复杂度 \(O(n)\)。
2.Gym104230C Toy Design
假设我们已经有 \(i\) 个设计,其中第 \(j(0\le j\le i)\) 个设计中前 \(j\) 个引脚连通,且相比 \(0\) 号设计多的边都只在前 \(j\) 个引脚之间。现在考虑第 \(i+1\) 个引脚,询问第 \(i+1\) 个引脚和第 \(j\) 个设计中 \(1\) 号引脚会得到在 \(0\) 号设计中第 \(i+1\) 个引脚和第 \(1\sim j\) 个引脚是否连通,于是可以通过二分在 \(\lceil\log_2 (i+1)\rceil\) 次询问内得到在 \(0\) 号设计中 \(1\sim i\) 中和 \(i+1\) 连通的最小编号(或不存在),并且一定会新得到一个设计满足前 \(i+1\) 个引脚连通,且相比 \(0\) 号设计多的边都只在前 \(i+1\) 个引脚之间。
询问次数为 \(\sum_{i=1}^n\lceil\log_2 i\rceil\)。
3.QOJ#4208. Flight to the Ford
时刻维护两个集合 \(T^{corr}\) 和 \(T^{wrong}\),表示最后一次询问得到答案在 \(T^{corr}\) 中、不在 \(T^{wrong}\) 中,可能成为答案的集合。初始时 \(T^{corr}=[1,10^9],T^{wrong}=\emptyset\)。之后每次找一个集合 \(P\subseteq T^{corr} \cup T^{wrong}\),如果要猜的数在 \(P\) 中,则传递 \(1\),否则传递 \(0\)。如果收到 \(1\) 则让 \(T'^{corr}=(T^{corr}\cap P)\cup(T^{wrong}\cap P)\),\(T'^{wrong}=T^{corr}\setminus P\);如果收到 \(0\) 则让 \(T'^{corr}=(T^{corr}\setminus P)\cup(T^{wrong}\setminus P)\),\(T'^{wrong}=T^{corr}\cap P\)。可以发现这样正确答案一定会留在 \(T^{corr}\cup T^{wrong}\) 中。为了每次尽可能稳定地减小 \(|T^{corr}\cup T^{wrong}|\),取 \(P=(T^{corr}\) 一半的元素\()\cup(T^{wrong}\) 一半的元素\()\),经计算 \(96\) 次以内可以把 \(|T^{corr}\cup T^{wrong}|\) 缩减为 \(3\),之后将三个数编码为 \(0000,0110,1111\) 再传递 \(4\) 次即可。
4.QOJ#193. Climbers
设 \(f(i,j)\) 表示一个人在 \(i\) 另一个人在 \([j,j+1)\) 的最小体力值,考虑每个人往左或往右走,每个点只会连出 \(O(1)\) 条边,直接跑最短路。
时间复杂度 \(O(n^2\log n)\),空间复杂度 \(O(n^2)\)。
5.LOJ#3884. 「eJOI2022」寻找树根 / Where Is the Root?
称度数为 \(1\) 的节点为叶节点,度数 \(>1\) 的节点为中间节点。一种暴力的想法是,询问所有点对,对于一个点 \(u\) 如果在所有询问 \((u,i)(1\le i\le n)\) 中都返回了 YES
,那就称其为候选节点,可以发现根一定是候选节点。如果恰好有一个候选节点,那么它就是根。
否则,有结论:如果有多个候选节点,那么根节点一定是叶节点!这是因为如果根节点度数 \(>1\),根的所有子树里都不可能有候选节点。
又有结论:不是根的候选节点全是中间节点!这是因为存在点度数至少为 \(3\),说明有至少 \(3\) 个叶节点,而对于任意两个不是根的叶节点返回的都是 NO
。
所以如果有不止一个候选节点,那么根就是所有叶节点中唯一一个候选节点。
现在考虑先询问一次所有叶节点,于是可以知道根节点是否是叶节点。如果是中间节点,可以给中间节点一个顺序,每次二分询问一段前缀和所有叶节点,它们的 LCA 一定是根节点;如果是叶节点,可以给叶节点一个顺序,每次二分询问一段前缀,它们的 LCA 只可能是中间节点或根节点(注意只剩两个叶节点时需要一些特判)。一共需要 \(\lceil\log_2 n\rceil+1\) 次。
考虑给所有节点一个顺序,使得叶节点都在中间节点的前面。每次二分询问一段前缀,由以上两种情况可以发现返回 YES
当且仅当根节点在这些前缀中,再特判一下只剩两个叶节点时情况即可。询问次数降到了 \(\lceil\log_2 n\rceil\) 次。
6.QOJ#4401. Prize
没讲。
7.Gym103806B MCD
问 \((0,0),(0,1),(1,0),(1,1)\) 可以知道 \(x,y\) 二进制下的最低位,在此基础上问 \((0,0),(0,2),(2,0),(2,2)\) 加上之前得出的最低位可以知道 \(x,y\) 二进制下的第二低位,以此类推。这样最坏要 \(4\log n=244\) 次,如果随机打乱一下期望要问 \(\frac{1+2+3+4}{4}\log n=2.5\log n=152.5\) 次。
其实除了最低位外其余位根本不需要再问一次 \((0,0)\) 加上之前得到的结果,也就是说期望总次数可以降到 \(1+\frac{0+1+2+3}{4}\log n=1+1.5\log n=92.5\) 次。
8.[First Round SOI 2021/2022]Claw Sort
没讲。