只有前20分,求差错,二分的思路
查看原帖
只有前20分,求差错,二分的思路
925190
_DANCER_楼主2023/7/8 15:34
#include <iostream>
typedef long long ll;

int solve(ll n, ll k)
{
    ll l = 1, r = (1ll << n) - 1, ans = 0;
    bool p = 0;
    while (l <= r)
    {
        ll mid = (l + r) / 2;
        ans++;
        if (mid > k)
        {
            r = mid - 1;
            p = 1; //在左侧
        }
        else if (mid < k)
        {
            l = mid + 1;
            p = 0; //在右侧
        }
        else
            break;
    }
    //求出地ans次折叠产生k
    //求地i-1次是什么,如果是0,左峰右谷,如果是1,左谷右峰
    std::string s;
    std::cin >> s;
    if (ans == 1)
        return 0;
    // std::cout << s[ans - 2] << '\n';
    return p ^ (s[ans - 2] - '0');
}

int main()
{
    freopen("P8960.in", "r", stdin);
    std::ios::sync_with_stdio(false);
    int T = 0;
    std::cin >> T;
    while (T--)
    {
        int n, k;
        std::cin >> n >> k;
        std::cout << (solve(n, k) ? "Up" : "Down") << '\n';
    }
    return 0;
}
2023/7/8 15:34
加载中...