带修改莫队 出现bug 求调
查看原帖
带修改莫队 出现bug 求调
527629
iqer楼主2022/2/26 11:02
#include <bits/stdc++.h>
using namespace std;

const int maxn = 2e5 + 5;
int n, m, pen[maxn];
struct op{ // 询问结构
    int l, r, id, t;
}ops[maxn];
struct fix{ // 修改结构
    int pos, color;
}fixs[maxn];

int part; // 分块大小
int op_num, fix_num; // 询问数目 修改数目
int sum, cnt[maxn]; // 转移过程
int ans[maxn]; // 答案数组

inline int cmp(op p1, op p2){ // 莫队排序
    if(p1.l / part != p2.l / part)return p1.l / part < p2.l / part;
    if(p1.r / part != p2.r / part)return p1.r / part < p2.r / part;
    return p1.t < p2.t;
}

void add(int color){
    if(!cnt[color])++sum;
    ++cnt[color];
}
void del(int color){
    --cnt[color];
    if(!cnt[color])--sum;
}
void update(int op, int t){ // 修改
    if(ops[op].l <= fixs[t].pos && ops[op].r >= fixs[t].pos){
        del(pen[fixs[t].pos]);
        add(fixs[t].color);
    }
    swap(fixs[t].color, pen[fixs[t].pos]);
}

int main(){
    cin >> n >> m; part = sqrt(n);
    for(int i = 1; i <= n; ++i)cin >> pen[i];
    for(int i = 1; i <= m; ++i){
        char x; cin >> x;
        if(x == 'Q')++op_num, cin >> ops[op_num].l >> ops[op_num].r, ops[op_num].id = op_num, ops[op_num].t = fix_num;
        else ++fix_num, cin >> fixs[fix_num].pos >> fixs[fix_num].color;
    }
    sort(ops + 1, ops + op_num + 1, cmp);
    int l = 1, r = 0, t = 0;
    for(int i = 1; i <= op_num; ++i){
        while(ops[i].l < l)add(pen[--l]);
        while(ops[i].r > r)add(pen[++r]);
        while(ops[i].l > l)del(pen[l++]);
        while(ops[i].r < r)del(pen[r--]);
        while(ops[i].t > t)update(i, ++t);
        while(ops[i].t < t)update(i, t--);
        ans[ops[i].id] = sum;
    }
    for(int i = 1; i <= op_num; ++i)cout << ans[i] << endl;
    return 0;
}
2022/2/26 11:02
加载中...