带修莫队求调 WA on #2
查看原帖
带修莫队求调 WA on #2
357163
shyr楼主2022/5/17 13:07
#include<bits/stdc++.h>
using namespace std;
const int N = 100005;
int c1 = 1, c2 = 1;
int n, m, a[N], b[N << 1], cnt[N << 1], level[N << 1], c[N], Ans[N];
struct Q{
	int l, r, id, pos, rpos, t;
}q[N];
struct xiu{
	int i, a, b;
}g[N];
bool cmp(Q a, Q b){
	if(a.pos != b.pos) return a.l < b.l;
	if(a.rpos != b.rpos) return a.r < b.r;
	return a.t < b.t;
}
void add(int x){
	level[cnt[x]]--;
	++cnt[x];
	level[cnt[x]]++;
}
void del(int x){
	level[cnt[x]]--;
	--cnt[x];
	level[cnt[x]]++; 
}
int main(){
	scanf("%d%d", &n, &m);
	int sz = pow(n, 0.6666666);
	int sum = n / sz;
	for(int i = 1; i <= n; ++i) scanf("%d", &a[i]), b[i] = a[i];
	int tot = n;
	for(int i = 1; i <= m; ++i){
		int opt;
		scanf("%d", &opt);
		if(opt == 1){
			scanf("%d%d", &q[c1].l, &q[c1].r);
			q[c1].id = c1, q[c1].t = c2;
			q[c1].pos = (q[c1].l - 1) / sz + 1;
			q[c1].rpos = (q[c1].r - 1) / sz + 1;
			c1++;
		}
		else{
			scanf("%d%d", &g[c2].i, &g[c2].b);
			b[++tot] = g[c2].b;
			c2++;
		}
	}
	sort(b + 1, b + 1 + tot);
	int len = unique(b + 1, b + 1 + tot) - b - 1;
	for(int i = 1; i <= n; ++i){
		int p = lower_bound(b + 1, b + 1 + len, a[i]) - b;
		a[i] = c[i] = p;
	}
	for(int i = 1; i < c2; ++i){
		int p = lower_bound(b + 1, b + 1 + len, g[i].b) - b;
		g[i].b = p;
		g[i].a = c[g[i].i];
		c[g[i].i] = g[i].b;
	}
	sort(q + 1, q + c1, cmp);
	int L = 1, R = 0, T = 1;
	for(int i = 1; i < c1; ++i){
		while(L < q[i].l) del(a[L++]);
		while(L > q[i].l) add(a[--L]);
		while(R < q[i].r) add(a[++R]);
		while(R > q[i].r) del(a[R--]);
		while(T < q[i].t){
			if(L <= g[T].i && g[T].i <= R){
				add(g[T].b), del(g[T].a);
			}
			++T;
			a[g[T].i] = g[T].b;
		}
		while(T > q[i].t){
			--T;
			if(L <= g[T].i && g[T].i <= R){
				add(g[T].a), del(g[T].b);
			}
			a[g[T].i] = g[T].a;
		}
		for(int j = 1; ; ++j){
			if(!level[j]){
				Ans[q[i].id] = j;
				break;
			}
		}
	}
	for(int i = 1; i < c1; ++i){
		printf("%d\n", Ans[i]);
	}
}

调了两天,一直找不到错误,求大佬帮助/bx

2022/5/17 13:07
加载中...