带修莫队1~10RE,11~13AC
查看原帖
带修莫队1~10RE,11~13AC
536745
WaTleZero_pt楼主2024/8/26 23:15

MnZn 第一次写带修莫队,求调。

#include<bits/stdc++.h>
using namespace std;
int bk;
char optype(){
	char c=getchar();
	while(c!='R'&&c!='Q') c=getchar();
	return c;
}
struct Operation{
	int l,r,t,id;
}op[133335]; int optot;
struct Update{
	int x,y;
}u[133335]; int updtot;
bool cmp(Operation a,Operation b){
	if(a.l/bk==b.l/bk)
		if(a.r/bk==b.r/bk) return a.t<b.t;
		else return a.r<b.r;
	else return a.l<b.l;
}
int ans=0;
int a[133335];
int cnt[1500010];
void addval(int x){
	if(cnt[a[x]]==0) ans++;
	cnt[a[x]]++;
}
void delval(int x){
	cnt[a[x]]--;
	if(cnt[a[x]]==0) ans--;
}
void updval(int oper){
	delval(a[u[oper].x]),addval(u[oper].y);
	swap(a[u[oper].x],u[oper].y);
}
int nowl,nowr,nowt;
int anslis[133335];
int n,m;
int main(){
	scanf("%d%d",&n,&m);
	bk=pow(n,2.0/3)+1e-9;
	nowl=1; nowr=n; nowt=0;
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		addval(i);
	}
	for(int i=1;i<=m;i++){
		if(optype()=='Q') optot++,op[optot].id=optot,op[optot].t=updtot,scanf("%d%d",&op[optot].l,&op[optot].r);
		else updtot++,scanf("%d%d",&u[updtot].x,&u[updtot].y);
	}
	sort(op+1,op+optot+1,cmp);
	for(int i=1;i<=optot;i++){
//		printf("%d %d %d\n",op[i].l,op[i].r,op[i].t);
		while(nowl<op[i].l) delval(nowl++);
		while(nowl>op[i].l) addval(--nowl);
		while(nowr<op[i].r) addval(++nowr);
		while(nowr>op[i].r) delval(nowr--);
		while(nowt<op[i].t) updval(++nowt);
		while(nowt>op[i].t) updval(nowt--);
//		printf("%d %d %d\n",nowl,nowr,nowt);
		anslis[op[i].id]=ans;
	}
	for(int i=1;i<=optot;i++) printf("%d\n",anslis[i]);
}
2024/8/26 23:15
加载中...