洛谷 P1903 [国家集训队] 数颜色 / 维护队列 & 带修莫队相关
作者:互联网
洛谷P1903 [国家集训队] 数颜色 / 维护队列 & 带修莫队相关
[洛谷P1903 [国家集训队] 数颜色 / 维护队列]([P1903 国家集训队] 数颜色 / 维护队列 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
-
带修莫队\(block = pow(n, 2.0 / 3.0)\)。
-
[奇技淫巧](题解 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]); }
-
往后挪 先加再扔进函数 ,往前挪 先扔进函数再加 ,约等于 一个\(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