社区讨论
带修莫队全RE求调
P1903【模板】带修莫队 / [国家集训队] 数颜色 / 维护队列参与者 1已保存回复 0
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 0 条
- 当前快照
- 1 份
- 快照标识符
- @ly0sl6gr
- 此快照首次捕获于
- 2024/06/30 08:07 2 年前
- 此快照最后确认于
- 2024/06/30 09:43 2 年前
CPP
#include <bits/stdc++.h>
using namespace std;
struct interval {
int l, r, id, dfn;
} q[114514];
struct upd {
int p, c, before;
} upda[114514];
int answer, cnt[114514], kc, n, m, a[114514], ans[114514];
int qcn, rcn;
bool cmp(interval aa, interval bb) {
if ((aa.l / kc ) == (bb.l / kc))
return aa.r < bb.r;
return aa.l < bb.l;
}
void add(int x) {
if (!cnt[a[x]])
answer++;
cnt[a[x]]++;
}
void del(int x) {
cnt[a[x]]--;
if (!cnt[a[x]])
answer--;
}
int main() {
scanf("%d%d", &n, &m);
kc = pow(n, 0.666);
for (int i = 1; i <= n; i++)
scanf("%d", &a[i]);
for (int i = 1; i <= m; i++) {
char qr;
int ll, rr;
cin >> qr >> ll >> rr;
if (qr == 'Q') {
++qcn;
q[qcn] = {ll, rr, qcn, rcn};
}
else {
++rcn;
upda[rcn].c = ll, upda[rcn].p = rr;
}
}
sort(q + 1, q + qcn + 1, cmp);
int L = 1, R = 1;
cnt[a[1]]++;
answer = 1;
int nup = 0;
for (int i = 1; i <= qcn; i++) {
while (L < q[i].l)
del(L++);
while (L > q[i].l)
add(--L);
while (R < q[i].r)
add(++R);
while (R > q[i].r)
del(R--);
while (nup < q[i].dfn) //更新修改
{
++nup;
int upid = upda[nup].c, updd = upda[nup].p;
if (L <= upid && upid <= R)
del(upid);
upda[nup].before = a[upid];
a[upid] = updd;
if (L <= upid && upid <= R)
add(upid);
}
while (nup > q[i].dfn) {
int upid = upda[nup].c, updd = upda[nup].p;
if (L <= upid && upid <= R)
del(upid);
a[upid] = upda[nup].before;
if (L <= upid && upid <= R)
add(upid);
nup--;
}
ans[q[i].id] = answer;
}
for (int i = 1; i <= qcn; i++) {
cout << ans[i] << endl;
}
}
回复
共 0 条回复,欢迎继续交流。
正在加载回复...