倍增求调WA#12
查看原帖
倍增求调WA#12
243333
JhdFarrell楼主2023/10/30 19:31
#include <cstdio>
#define reg register

constexpr int maxn = 200000;
constexpr int mlg = 15;

int dp[mlg + 2][maxn + 2], sz[mlg + 2][maxn + 2];

inline int read() {
    reg int rtn = 0;
    reg char c;
    for (c = getchar(); c < '0' || c > '9'; c = getchar());
    for (; c >= '0' && c <= '9'; c = getchar())
        rtn = (rtn << 3) + (rtn << 1) + c - 48;
    return rtn;
}

void initSt(int m) {
    for (reg int k = 1, tmp; k <= mlg; ++k) {
        tmp = m - (1 << k) + 1;
        for (reg int i = 1; i <= tmp; ++i) {
            dp[k][i] = dp[k - 1][i] ^ dp[k - 1][i + (1 << k - 1)];
            if (sz[k - 1][i + (1 << k - 1)] & 1)
                dp[k][i] |= (1 << k - 1);
            sz[k][i] = sz[k - 1][i] + sz[k - 1][i + (1 << k - 1)];
            // printf("%d %d %d %d\n", k, i, dp[k][i], sz[k][i]);
        }
    }
}

int main() {
    reg int n, m, q, cur, ans;
    n = read(); m = read();
    for (; n--; ) {
        q = read();
        ++sz[0][q];
    }

    initSt(m); q = read();
    for (; q--; ) {
        n = read(); m = read();
        cur = n; ans = 0;
        for (reg int k = mlg; ~k; --k) {
            if (cur + (1 << k) - 1 <= m) {
                ans ^= dp[k][cur];
                if (sz[k][cur] & 1)
                    ans ^= (cur - n);
                cur += 1 << k;
            } else if (cur > m) {
                break;
            }
        }
        putchar(ans ? 'A' : 'B');
    }

#ifndef ONLINE_JUDGE
    while (1);
#endif

    return 0;
}
2023/10/30 19:31
加载中...