HKU Provincists 4th Training
题目来自 2023-2024 ICPC Brazil Subregional Programming Contest。link
This article provides a feasible solution to a certain competitive programming problem. If you have better solutions, feel free to share with me!
Best Fair Shuffles
思维+猜结论题,这种题没想出来真没办法,就是菜。
在序列中寻找最长的形如 \(1,2,...,x_1\) 的子序列,再寻找形如 \(x_1+1,...,x_2\) 的子序列,再寻找 \(x_2+1,...,x_3\) 的子序列……若最终找到了 \(k\) 个这样的子序列,答案为 \(\log_2(k)\)。
比较 intuitive 的证明:一次 fair shuffle 至多会将这样的子序列数量翻倍,因此 \(m\) 次 fair shuffle 后得到的序列中最多将会有 \(2^m\) 个子序列。
1 |
|
Challenging Hike
树上最长上升子序列问题。由于要在树上回溯,需要撤销操作,解普通最长上升子序列的树状数组要改成支持单点修改区间维护的最大值线段树。顺便也复习了一下离散化。
1 |
|
Extracting Pollen
很喜欢这道题。\(K\leq 10^9\),显然暴力模拟行不通。观察到 \(F_i\leq 10^6\),于是考虑从权值入手来做。用桶来存花朵的权值并从后往前扫描模拟采蜜过程,当 \(k\) 小于当前花朵的数量时就能够确定答案了。
其实这个方法本质上与暴力模拟的思路是一致的;但是把重心放到值域上后再来设计模拟就能保证 \(O(F)\) 的效率,真的很巧。
1 |
|
Great Treaty of Byteland
可以发现答案就是凸包上的点。凸包上两个相邻王国的边界即为连接它们的凸包边线段的法线,该法线是朝无限远处延申的。队友留下这一句结论就匆匆离席,徒留我一人挣扎在凸包 debug 地狱。
再次感受到准备好板子的重要性。以下程序可以作为 Andrew 算法求凸包的模板。(一开始写的是 Graham 扫描算法,但因为极角排序造成的精度问题 WA 爆了,,,求凸包还是用 Andrew 算法好)
1 |
|
Investigating 0s and 1s
比较基础的 DP。朴素想法是 \(O(n^2)\) 的,将第二维状态按照奇偶压缩成 \(0/1\) 后就能得到 \(O(n)\) 的 DP 了。
1 |
|
Maximizing Flight Efficiency
很好想。若从 \(a\) 到 \(b\) 的直飞航班可以取消,那么一定存在一种转机方式的成本和直飞的价格一致。判断 coherent 与后续的直飞航班取消方案都可以用类似 Floyd 的方式解决。
1 |
|