悬关求助莫队卡常 TLE on #12
查看原帖
悬关求助莫队卡常 TLE on #12
1343921
Luxizhel楼主2024/4/23 15:48

rt,写的 O(nnlog⁡n)O(n\sqrt{n}\log n) 的,常数也太难卡了,但是不想改回滚莫队,还有其他办法吗)

#pragma GCC optimize("Ofast")
#pragma GCC optimize("no-stack-protector,unroll-loops,fast-math,inline")
#pragma GCC target("avx,avx2,abm,mmx,fma")
#pragma GCC target("sse,sse2,sse3,sse4,sse4.1,sse4.2,ssse3")
#include <algorithm>
#include <iostream>

using namespace std;

const int N = 2e5 + 5;

int n, m, k, mc[N], len, id[N];
char ans[N];
struct Q
{
    int l, r, id;
} q[N];
struct
{
    int tr[N * 2][2], cnt[N * 2], xval, idx = 1;
    void insert(int x)
    {
        int p = 1;
        for (int i = 0; i < 18; i++)
        {
            int b = x >> i & 1;
            if (!tr[p][b])
                tr[p][b] = ++idx;
            p = tr[p][b], cnt[p]++;
        }
        xval ^= x;
    }
    void remove(int x)
    {
        int p = 1;
        for (int i = 0; i < 18; i++)
        {
            int b = x >> i & 1;
            p = tr[p][b], cnt[p]--;
        }
        xval ^= x;
    }
    void add()
    {
        int p = 1;
        for (int i = 0; p; i++)
        {
            if ((cnt[tr[p][1]] ^ cnt[tr[p][0]]) & 1)
                xval ^= 1 << i;
            swap(tr[p][0], tr[p][1]), p = tr[p][0];
        }
    }
    void del()
    {
        int p = 1;
        for (int i = 0; p; i++)
        {
            if ((cnt[tr[p][1]] ^ cnt[tr[p][0]]) & 1)
                xval ^= 1 << i;
            swap(tr[p][0], tr[p][1]), p = tr[p][1];
        }
    }
} T;

void read(int &x)
{
    static char ch = getchar();
    x = 0;
    while (!isdigit(ch))
        ch = getchar();
    while (isdigit(ch))
        x = (x << 3) + (x << 1) + (ch ^ 48), ch = getchar();
}

int main()
{
    read(n), read(m);
    while (n--)
    {
        int x;
        read(x), mc[x] ^= 1;
    }
    read(k);
    for (int i = 1; i <= k; i++)
        read(q[i].l), read(q[i].r), q[i].id = i;
    len = __builtin_sqrt(m);
    for (int i = 1; i <= m; i++)
        id[i] = (i + len - 1) / len;
    sort(q + 1, q + k + 1, [](Q a, Q b) {
        if (id[a.l] ^ id[b.l])
            return a.l < b.l;
        return id[a.l] & 1 ? a.r < b.r : a.r > b.r;
    });
    for (int i = 1, l = 1, r = 0; i <= k; i++)
    {
        while (l > q[i].l)
        {
            T.add();
            if (mc[--l])
                T.insert(0);
        }
        while (r < q[i].r)
            if (mc[++r])
                T.insert(r - l);
        while (l < q[i].l)
        {
            if (mc[l++])
                T.remove(0);
            T.del();
        }
        while (r > q[i].r)
            if (mc[r--])
                T.remove(r + 1 - l);
        ans[q[i].id] = T.xval ? 'A' : 'B';
    }
    fwrite(ans + 1, 1, k, stdout);
    return 0;
}
2024/4/23 15:48
加载中...