蓝名萌新求助带修莫队
查看原帖
蓝名萌新求助带修莫队
328855
_disorder_楼主2020/7/11 15:24

rt,只有最后三个点AC,其他都RE

数组应该是开够了

#include <cstdio>
#include <algorithm>
#include <cmath>

using namespace std;

#define in inline
typedef long long ll;
in ll max(ll x, ll y) {return x > y ? x : y;}
in ll min(ll x, ll y) {return x < y ? x : y;}
in void swap(int &x, int &y) {x ^= y ^= x ^= y;}
#define rei register int
#define rep(i, l, r) for(rei i = l, i##end = r; i <= i##end; ++i)
#define repd(i, r, l) for(rei i = r, i##end = l; i >= i##end; --i)
char inputbuf[1 << 22], *p1 = inputbuf, *p2 = inputbuf;
#define getchar() (p1 == p2 && (p2 = (p1 = inputbuf) + fread(inputbuf, 1, 1 << 21, stdin), p1 == p2) ? EOF : *p1++)
in int read() {
	int res = 0; char ch = getchar(); bool f = true;
	for(; ch < '0' || ch > '9'; ch = getchar())
		if(ch == '-') f = false;
		else if(ch == 'Q') return -1;
		else if(ch == 'R') return -2;
	for(; ch >= '0' && ch <= '9'; ch = getchar())
		res = res * 10 + (ch ^ 48);
	return f ? res : -res;
}
const int N = 233335;

int a[N], cnt[1100005], bl, bel[N], _ans, n, ans[N];//bel是每个位置所属的块
struct _Q_ {//查询
	int l, r, k, q, i;
} q[N];
struct _M_ {//修改
	int i, x;
} mdf[N];

in bool cmp(const _Q_ x, const _Q_ y) {
	if(bel[x.l] ^ bel[y.l]) return x.l < y.l;
	if(bel[x.r] ^ bel[y.r]) return x.r < y.r;
	return x.q < y.q;
}

in void add(int i) {if(!cnt[a[i]]++) ++_ans;}
in void del(int i) {if(!--cnt[a[i]]) --_ans;}
in void modify(int k, int l, int r) {
	int i = mdf[k].i;
	if(l <= i && i <= r) add(mdf[k].x), del(a[i]);
	swap(mdf[k].x, a[i]);
}

signed main() {
	int l, r, kk, tot, tot2, tmpq, qq;//tmpq是离本次查询最近的修改的位置
	l = r = kk = tot = tot2 = tmpq = 0;
	n = read(); qq = read();
	bl = pow(n, double(2) / 3);
	
	rep(i, 1, n) a[i] = read();
	for(; qq; --qq) {
		if(~read()) {
			tmpq = ++tot2;
			mdf[tot2].i = read();
			mdf[tot2].x = read();
		}
		else {
			q[++tot].l = read();
			q[tot].r = read();
			q[tot].q = tmpq;
			q[tot].i = tot;
		}
	}
	rep(i, 1, n) bel[i] = (i - 1) / bl + 1;
	sort(q + 1, q + tot + 1, cmp);

	rep(i, 1, tot) {
		while(l > q[i].l) add(--l);
		while(r < q[i].r) add(++r);
		while(l < q[i].l) del(l++);
		while(r > q[i].r) del(r--);
		while(kk < q[i].q) modify(++kk, l, r);
		while(kk > q[i].q) modify(kk--, l, r);
		ans[q[i].i] = _ans;
	}
	
	rep(i, 1, tot) printf("%d\n", ans[i]);
	return 0;
}
2020/7/11 15:24
加载中...