WA 求助(AC后三个点)
查看原帖
WA 求助(AC后三个点)
556362
Unnamed114514楼主2022/10/8 23:19
#include<bits/stdc++.h>
using namespace std;
const int maxn=2e5,maxt=1e6+5;
int cnt[maxt],l=1,r,c,n,m,s,len,num,tot,ans[maxn],a[maxn],b[maxn],t[maxn],pre[maxn],nxt[maxn],now[maxn];
struct node{
	int l,r,c,id;
	inline bool operator <(const node &o) const{
		return t[l]<t[o.l]||(t[l]==t[o.l]&&t[r]<t[o.r])||(t[l]==t[o.l]&&t[r]==t[o.r]&&c<o.c);
	}
}f[maxn];
inline int read(){
	int res=0,f=0;
	char ch=getchar();
	while(ch<'0'||ch>'9'){
		f|=(ch=='-');
		ch=getchar();
	}
	while(ch>='0'&&ch<='9'){
		res=(res<<1)+(res<<3)+(ch^'0');
		ch=getchar();
	}
	return f?-res:res;
}
inline void right(int t,int u){
	if(f[u].l<=now[t]&&now[t]<=f[u].r&&cnt[a[now[t]]]==1)
		--s;
	--cnt[a[now[t]]];
	a[now[t]]=nxt[t];
	++cnt[a[now[t]]];
	if(f[u].l<=now[t]&&now[t]<=f[u].r&&cnt[a[now[t]]]==1)
		++s;
}
inline void left(int t,int u){
	if(f[u].l<=now[t]&&now[t]<=f[u].r&&cnt[a[now[t]]]==1)
		--s;
	--cnt[a[now[t]]];
	a[now[t]]=pre[t];
	++cnt[a[now[t]]];
	if(f[u].l<=now[t]&&now[t]<=f[u].r&&cnt[a[now[t]]]==1)
		++s;
}
inline void add(int t){
	++cnt[a[t]];
	if(cnt[a[t]]==1)
		++s;
}
inline void del(int t){
	if(cnt[a[t]]==1)
		--s;
	--cnt[a[t]];
}
int main(){
	n=read(),m=read();
	for(int i=1;i<=n;++i){
		a[i]=b[i]=read();
		if(a[i]>1e6)
			return 0;
	}
	len=pow(n,2.0/3.0);
	for(int i=1;i<=(n+len-1)/len;++i)
		for(int j=(i-1)*len+1;j<=min(n,i*len);++j)
			t[j]=i;
	for(int i=1;i<=m;++i){
		char ch=getchar();
		while(ch!='Q'&&ch!='R')
			ch=getchar();
		if(ch=='Q'){
			++num;
			f[num].l=read(),f[num].r=read(),f[num].c=tot,f[num].id=num;
		} else{
			++tot;
			now[tot]=read();
			pre[tot]=b[now[tot]];
			b[now[tot]]=nxt[tot]=read();
		}
	}
	sort(f+1,f+num+1);
	for(int i=1;i<=num;++i){
		while(l>f[i].l) add(--l);
		while(l<f[i].l) del(l++);
		while(r>f[i].r) del(r--);
		while(r<f[i].r) add(++r);
		while(c<f[i].c) right(++c,i);
		while(c>f[i].c) left(c--,i);
		ans[f[i].id]=s;
	}
	for(int i=1;i<=num;++i)
		printf("%d\n",ans[i]);
	return 0;
}
2022/10/8 23:19
加载中...