带修莫队36分求改正
查看原帖
带修莫队36分求改正
1025321
midsummer_zyl楼主2024/1/13 21:02

rtrt

TLE+WATLE+WA 求求大佬

#include <bits/stdc++.h>
#define LL long long
using namespace std;
const int N = 2e6 + 10;
const int V = 4e6 + 10;
int cnt[V], w[N], ans[N];
int n, m, cntq, cntr, cur, siz;
struct node {
    int l, r, t, id;
    bool operator<(const node& o) const {
        if (l / siz == o.l / siz) {
            if (r / siz == o.r / siz)
                return t < o.t;
            return r < o.r;
        }
        return l < o.l;
    }
} qry[N], qr[N];
inline int read() {
    int f = 1, s = 0;
    char c = getchar();
    while (c < '0' || c > '9') {
        if (c == '-')
            f = -1;
        c = getchar();
    }
    while (c >= '0' && c <= '9') {
        s = s * 10 + c - '0';
        c = getchar();
    }
    return f * s;
}
inline void add(int v) {
    if (cnt[v] == 0)
        cur++;
    cnt[v]++;
}
inline void del(int v) {
    cnt[v]--;
    if (cnt[v] == 0)
        cur--;
}
inline void update(int v, int t) {
    if (qry[v].l <= qr[t].l && qr[t].l <= qry[v].r) {
        del(w[qr[t].l]);
        add(qr[t].r);
    }
    swap(w[qr[t].l], qr[t].r);
}
int main() {
    n = read();
    m = read();
    siz = sqrt(n);
    for (int i = 1; i <= n; ++i)
		w[i] = read();
    for (int i = 1; i <= m; ++i) {
        char x; scanf("%c ", &x);
        int l, r; l = read(), r = read();
        if (x == 'Q') {
            qry[++cntq].l = l;
            qry[cntq].r = r;
            qry[cntq].t = cntr;
            qry[cntq].id = cntq;
        } else {
            qr[++cntr].l = l;
            qr[cntr].r = r;
        }
    }
    sort(qry + 1, qry + cntq + 1);
    LL l = 1, r = 0, t = 0;
    for (LL i = 1; i <= cntq; ++i) {
        while (l < qry[i].l) del(w[l++]);
        while (l > qry[i].l) add(w[--l]);
        while (r < qry[i].r) add(w[++r]);
        while (r > qry[i].r) del(w[r--]);
        while (t < qry[i].t) update(i, ++t);
        while (t > qry[i].t) update(i, t--);
        ans[qry[i].id] = cur;
    }
    for (int i = 1; i <= cntq; ++i)
        printf("%d\n", ans[i]);
    return 0;
}

2024/1/13 21:02
加载中...