蹲大佬求改
查看原帖
蹲大佬求改
784710
wangjiayue楼主2024/12/5 22:16
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=2e6+5;
struct node{
	ll l,r,t,id;
}e[N],er[N];
ll n,m,k,t,ans[N],a[N],tr[N],mp[N],cnt,qu,nxtl=1,nxtr,c,cnte,l,r;
char opt;
bool cmp(node x,node y){
	if(x.l/qu!=y.l/qu) return x.l/qu<y.l/qu;
	if(x.r/qu!=y.r/qu) return x.r/qu<y.r/qu;
	return x.t<y.t;
}
void del(ll x){
	mp[x]--;
	if(mp[x]==0) c--;
}
void add(ll x){
	mp[x]++;
	if(mp[x]==1) c++;
}
void pre(ll t){
	if(er[t].l>=nxtl&&er[t].r<=nxtr){
		del(a[er[t].l]);
		add(er[t].r);
	}
	swap(a[er[t].l],er[t].r);
}
int main(){
//	freopen("24531.in","r",stdin);
//	freopen("24531.oot","w",stdout);
	scanf("%lld%lld",&n,&m);
	qu=pow(n,2.0/3.0);
	for(int i=1;i<=n;i++) scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++){
		cin>>opt;
		scanf("%lld%lld",&l,&r);
		if(opt=='Q') 
			e[++cnte].l=l,e[cnte].r=r,e[cnte].t=cnt,e[cnte].id=cnte;
		else er[++cnt].l=l,er[cnt].r=r;
	}
	sort(e+1,e+1+cnte,cmp);
	for(int i=1;i<=cnte;i++){
		while(nxtl<e[i].l) del(a[nxtl++]);
		while(nxtl>e[i].l) add(a[--nxtl]);
		while(nxtr<e[i].r) add(a[++nxtr]);
		while(nxtr>e[i].r) del(a[nxtr--]);
		while(t<e[i].t) pre(++t);
		while(t>e[i].t) pre(t--);
		ans[e[i].id]=c;
	}
	for(int i=1;i<=cnte;i++) printf("%lld\n",ans[i]);
	return 0;
}

就对了最后三个点,其余全WA

2024/12/5 22:16
加载中...