1 条题解
-
0
一个更简单的赛时做法。我的 APIO 2026 游记 详细记录了我赛时的想法。
测试点 #3
考虑取 ,这个序列满足 的性质,当 被加入 中后,在 及其右侧的位置,该性质会被破坏。
从大往小考虑 中的每一项,直到找到 中最大的满足性质的项 ,我们知道 的位置恰好在这一项之后。令 ,我们依次尝试往 中加入 ,检查 的和是否超过 ,若超过则删除,不超过则保留即可在 次操作内得到 的值。
测试点 #4
由于 ,从信息论的角度我们需要用上返回的 的每一种可能值。同时 ,我们可以使用不超过 的所有数。
因此取 ,在加入 后,下标从 开始的 满足这样的性质:若 ,则 ;否则 。
受到测试点 #3 的启发,考虑从高往低确定 在三进制下的每一位。对于最高位,考虑下标为 的数,若 最高位为 , 三个下标对应的值分别为:
- ;
- ;
- 。
不难发现通过询问 和 可以区分这三种情况。
确定非最高位 时,设目前已经确定的更高位为 ,类似考虑下标为 的数。唯一不同的地方是在原来的基础上 会比 多一个 ,由于 ,所以 ,改为询问 和 即可。
这个做法没有任何细节,代码也非常短,这里给出测试点 #4 中
find_tastiness函数的完整代码:int ans = 0, pw = 729; for (int i = 6; i >= 0; i--) { int a = ans + pw - 1, b = ans + pw * 2 - 1, c = ans + pw * 3 - 1; int res = ans ? compare_tastiness({a, b}, {c, ans - 1}) : compare_tastiness({a, b}, {c}); ans += pw * (res + 1), pw /= 3; } return ans;
- 1
信息
- ID
- 12583
- 时间
- 10000ms
- 内存
- 1100MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者