普通莫队 TLE 求助
查看原帖
普通莫队 TLE 求助
655192
Tibrella楼主2023/5/17 22:18
#include <algorithm>
#include <cmath>
#include <iostream>

using std::cin;
using std::cout;

#define N 30005
#define Q 200005
#define INT 1000006

int lis[N];
int n, q;

int block, idx, hav;

struct ele {
    int l, r;
    int id;
    int block_id;

    void read(int idx) {
        block_id = (l - 1) / block + 1;
        id = idx;
        cin >> l >> r;
    }

    void debug() {
        cout << "id: " << id << " l: " << l << " r: " << r << " blockid: " << block_id << '\n';
    }
} que[Q];

int cnt[INT];
int res;
int ans[Q];

void ins(int x) {
    if (!cnt[lis[x]]) ++res;
    ++cnt[lis[x]];
}

void del(int x) {
    --cnt[lis[x]];
    if (!cnt[lis[x]]) --res;
}

int main() {
    std::ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);

    cin >> n;
    for (int i = 1; i <= n; ++i)
        cin >> lis[i];
    cin >> q;
    block = sqrt(n);
    idx = 1;
    for (int i = 1; i <= q; ++i) {
        if (hav > block) {
            hav = 0;
            ++idx;
        }
        ++hav;
        que[i].read(i);
    }
    std::sort(que + 1, que + q + 1, [](ele& a, ele& b) {
        if (a.block_id == b.block_id) {
            return (a.block_id & 1) ? a.r < b.r : a.r > b.r;
        } else
            return a.block_id < b.block_id;
    });
    int l, r;
    l = r = 0;
    for (int i = 1; i <= q; ++i) {
        int ql = que[i].l, qr = que[i].r;
        while (l < ql)
            del(l++);
        while (l > ql)
            ins(--l);
        while (r > qr)
            del(r--);
        while (r < qr)
            ins(++r);
        ans[que[i].id] = res;
    }

    for (int i = 1; i <= q; ++i)
        cout << ans[i] << '\n';

    return 0;
}
2023/5/17 22:18
加载中...