1 条题解

  • 0
    @ 2026-8-4 23:56:46

    一个更简单的赛时做法。我的 APIO 2026 游记 详细记录了我赛时的想法。

    测试点 #3

    考虑取 a={20,20,21,22,,229}a=\{2^0,2^0,2^1,2^2,\dots,2^{29}\},这个序列满足 ai=j=0i1aja_i=\sum\limits_{j=0}^{i-1}a_j 的性质,当 dd 被加入 aa 中后,在 dd 及其右侧的位置,该性质会被破坏。

    从大往小考虑 aa 中的每一项,直到找到 aa 中最大的满足性质的项 2i2^i,我们知道 dd 的位置恰好在这一项之后。令 S={2i}S=\{2^i\},我们依次尝试往 SS 中加入 2i1,2i2,,202^{i-1},2^{i-2},\dots,2^0,检查 SS 的和是否超过 dd,若超过则删除,不超过则保留即可在 log2W=30\lceil\log_2 W\rceil=30 次操作内得到 dd 的值。

    测试点 #4

    由于 37=21873^7=2187,从信息论的角度我们需要用上返回的 1,0,1-1,0,1 的每一种可能值。同时 2187W+2002187\le W+200,我们可以使用不超过 373^7 的所有数。

    因此取 a={1,2,3,,37}a=\{1,2,3,\dots,3^7\},在加入 dd 后,下标从 11 开始aa 满足这样的性质:若 idi\le d,则 ai=ia_i=i;否则 ai=i1a_i=i-1

    受到测试点 #3 的启发,考虑从高往低确定 dd 在三进制下的每一位。对于最高位,考虑下标为 a=36,b=2×36,c=3×36a=3^6,b=2\times3^6,c=3\times3^6 的数,若 dd 最高位为 2,1,02,1,0a,b,ca,b,c 三个下标对应的值分别为:

    • 36,2×36,3×3613^6,2\times3^6,3\times3^6-1
    • 36,2×361,3×3613^6,2\times3^6-1,3\times3^6-1
    • 361,2×361,3×3613^6-1,2\times3^6-1,3\times3^6-1

    不难发现通过询问 S1={a,b}S_1=\{a,b\}S2={c}S_2=\{c\} 可以区分这三种情况。

    确定非最高位 3i3^i 时,设目前已经确定的更高位为 rr,类似考虑下标为 r+3i,r+2×3i,r+3×3ir+3^i,r+2\times 3^i,r+3\times 3^i 的数。唯一不同的地方是在原来的基础上 a+ba+b 会比 cc 多一个 rr,由于 rdr\le d,所以 ar=ra_r=r,改为询问 {a,b}\{a,b\}{c,r}\{c,r\} 即可。

    这个做法没有任何细节,代码也非常短,这里给出测试点 #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
    上传者