萌新求助分块 RE
查看原帖
萌新求助分块 RE
305027
Egg_eating_master楼主2022/11/18 09:48

RT,和题解狂拍一千组没出错,人麻了

#include<bits/stdc++.h>
using namespace std;
const int maxn = 200005, maxb = 325;
int n, m, block, t;
int a[maxn];
int st[maxb], ed[maxb], pos[maxn];
short f[maxb][maxn << 1];
struct node {int p, x, y, k;} d[maxn];
int ind[maxn << 1], cnt;
void discrete() {
    for (int i = 1; i <= n; i++) ind[++cnt] = a[i];
    for (int i = 1; i <= m; i++)
        if (d[i].p == 2) ind[++cnt] = d[i].k;
    sort(ind + 1, ind + 1 + cnt);
    int len = unique(ind + 1, ind + 1 + cnt) - ind - 1;
    for (int i = 1; i <= n; i++) a[i] = lower_bound(ind + 1, ind + 1 + len, a[i]) - ind;
    for (int i = 1; i <= m; i++)
        if (d[i].p == 2) d[i].k = lower_bound(ind + 1, ind + 1 + len, d[i].k) - ind;
}
void init() {
    block = sqrt(n); t = ceil(n * 1. / block);
    for (int i = 1; i <= t; i++) {
        st[i] = (i - 1) * block + 1; ed[i] = min(i * block, n);
        for (int j = st[i]; j <= ed[i]; j++) pos[j] = i;
    }
    for (int i = 1; i <= n; i++) f[pos[i]][a[i]]++;
}
void update(int x, int y) {
    int p = pos[x];
    f[p][a[x]]--; f[p][y]++;
    a[x] = y;
}
int query(int x, int y, int k) {
    int p = pos[x], q = pos[y], ans = 0;
    if (p == q) {
        for (int i = x; i <= y; i++) ans += (a[i] == k);
        return ans;
    }
    for (int i = p + 1; i <= q - 1; i++) ans += f[i][k];
    for (int i = x; i <= ed[p]; i++) ans += (a[i] == k);
    for (int i = st[q]; i <= y; i++) ans += (a[i] == k);
    return ans;
}
int main() {
    freopen("P2464.in", "r", stdin);
    freopen("P2464.out", "w", stdout);
    cin >> n >> m;
    for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
    for (int i = 1; i <= m; i++) {
        char c; int x, y, k; cin >> c; scanf("%d%d", &x, &y);
        if (c == 'C') d[i] = (node){1, x, y, 0};
        else {scanf("%d", &k); d[i] = (node){2, x, y, k};}
    }
    discrete(); init();
    for (int i = 1; i <= m; i++)
        if (d[i].p == 1) update(d[i].x, d[i].y);
        else printf("%d\n", query(d[i].x, d[i].y, d[i].k));
    return 0;
}
2022/11/18 09:48
加载中...