1 条题解

  • 0
    @ 2024-9-26 12:36:29

    递归/分治

    将第 nn 阶段的方格可以拆分为 44n1n-1 阶段的方格,找到其中的变化规律,进行分治即可。

    imag

    len 表示当前一行点数的 1/2;

    cnt 表示当前所有点数的 1/4。

    #include <bits/stdc++.h>
    using namespace std;
    typedef long long ll;
    #define pll pair<ll, ll>
    const int N = 1e6 + 10, INF = 0x3f3f3f3f, MOD = 1E9 + 7;
    
    pll cal(ll n, ll a) {
        if (n == 0) return {0, 0};
        ll len = 1ll << (n - 1);
        ll cnt = 1ll << (2 * n - 2);
        pll tm = cal(n - 1, a % cnt);
        int x = tm.first, y = tm.second;
        ll f = a / cnt;
        if (f == 0) return {y, x};
        if (f == 1) return {x, y + len};
        if (f == 2) return {x + len, y + len};
        if (f == 3) return {2 * len - y - 1, len - x - 1};
    }
    
    int main(int argc, char* argv[]) {
        ll T, n, a, b; scanf("%lld", &T);
        while (T--) {
            scanf("%lld%lld%lld", &n, &a, &b);
            auto pa = cal(n, a - 1), pb = cal(n, b - 1);
            ll x = pa.first - pb.first;
            ll y = pa.second - pb.second;
            double dis = sqrt(x * x + y * y) * 10;
            printf("%.0lf\n", dis);
        }
        return 0;
    }
    
    • 1

    信息

    ID
    1435
    时间
    1000ms
    内存
    256MiB
    难度
    5
    标签
    递交数
    152
    已通过
    62
    上传者