其他分享
首页 > 其他分享> > 洛谷 P1903 [国家集训队] 数颜色 / 维护队列 & 带修莫队相关

洛谷 P1903 [国家集训队] 数颜色 / 维护队列 & 带修莫队相关

作者:互联网

洛谷P1903 [国家集训队] 数颜色 / 维护队列 & 带修莫队相关

[洛谷P1903 [国家集训队] 数颜色 / 维护队列]([P1903 国家集训队] 数颜色 / 维护队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))

  1. 带修莫队\(block = pow(n, 2.0 / 3.0)\)。

  2. [奇技淫巧](题解 P1903 【【模板】分块/带修改莫队(数颜色)】 - attack 的博客 - 洛谷博客 (luogu.com.cn))

    void upd(int now, int p) {
        if (c[now].pos >= q[p].l && c[now].pos <= q[p].r) {
            cnt[a[c[now].pos]]--;
            if (cnt[a[c[now].pos]] == 0) sum--;
            cnt[c[now].val]++;
            if (cnt[c[now].val] == 1) sum++;
        }
        swap(c[now].val, a[c[now].pos]);
    }
    
    1. 往后挪 先加再扔进函数 ,往前挪 先扔进函数再加约等于 一个\(add\) 一个\(del\)。

      while (now < q[i].last) upd(++now, i);
              while (now > q[i].last) upd(now--, i);
      

AC Code

#include <bits/stdc++.h>

using namespace std;

const int MN = 2e6 + 10;

int n, m, block, q_, c_, sum;
int a[MN], belong[MN], cnt[MN], ans[MN];
struct Query {
    int l, r, last, id;
    bool operator < (const Query &x) const {
        return belong[l] != belong[x.l] ? belong[l] < belong[x.l] : belong[r] != belong[x.r] ? belong[r] < belong[x.r] : last < x.last;
    }
} q[MN];
struct Change {
    int pos, val;
} c[MN];

void add(int x) {
    cnt[x]++;
    sum += cnt[x] == 1;
}

void del(int x) {
    cnt[x]--;
    sum -= cnt[x] == 0;
}

void upd(int now, int p) {
    if (c[now].pos >= q[p].l && c[now].pos <= q[p].r) {
        cnt[a[c[now].pos]]--;
        if (cnt[a[c[now].pos]] == 0) sum--;
        cnt[c[now].val]++;
        if (cnt[c[now].val] == 1) sum++;
    }
    swap(c[now].val, a[c[now].pos]);
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> m; block = pow(n, 2.0 / 3.0);
    for (int i = 1; i <= n; ++i) {
        cin >> a[i];
        belong[i] = (i - 1) / block + 1;
    }
    for (int i = 1; i <= m; ++i) {
        char op;
        cin >> op;
        if (op == 'Q') {
            cin >> q[++q_].l >> q[q_].r;
            q[q_].last = c_;
            q[q_].id = q_;
        }
        else cin >> c[++c_].pos >> c[c_].val;
    }
    sort(q + 1, q + 1 + m);
    for (int i = 1, l = 1, r = 0, now = 0; i <= m; ++i) {
        while (l > q[i].l) add(a[--l]);
        while (r < q[i].r) add(a[++r]);
        while (l < q[i].l) del(a[l++]);
        while (r > q[i].r) del(a[r--]);
        while (now < q[i].last) upd(++now, i);
        while (now > q[i].last) upd(now--, i);
        ans[q[i].id] = sum;
    }
    for (int i = 1; i <= q_; ++i) cout << ans[i] << '\n';
    return 0;
}

标签:MN,洛谷,int,belong,P1903,++,last,now,国家集训队
来源: https://www.cnblogs.com/zjsqwq/p/16366999.html