求助带修莫队+hash储存TLE QAQ #2 #8
查看原帖
求助带修莫队+hash储存TLE QAQ #2 #8
663629
lrjdsb楼主2022/10/20 17:27

求助带修莫队+hash储存TLE QAQ #2 #8

#include<bits/stdc++.h>
#define N 100005
#define M 30000005
using namespace std;
int n,m,i,j,cmp,l=1,r,rt,cntq,cntc,u[M],rem[M],a[N],ans[N];
char c;
struct qwq{
	int l,r,t,x,p;
	bool operator < (const qwq &A) const{
		return l/cmp==A.l/cmp?r/cmp==A.r/cmp?t<A.t:r<A.r:l<A.l;
	}
}d[N];
struct awa{
	int w,a;
}q[N];
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while(c<'0' || c>'9'){
		if(c=='-') f=-1;
		c=getchar();
	}
	while(c>='0' && c<='9'){
		x=(x<<3)+(x<<1)+c-48;
		c=getchar();
	}
	return x*f;
}
inline int haxi(int n){
	int k=n%M;
	while(u[k] && u[k]!=n) if(++k==M) k=0;
	u[k]=n;
	return k;
}
inline void add(int n){
	rem[haxi(a[n])]++;
}
inline void del(int n){
	rem[haxi(a[n])]--;
}
inline void upd(int n){
	if(q[n].w>=l && q[n].w<=r){
		del(q[n].w);
		rem[haxi(q[n].a)]++;
	}
	swap(a[q[n].w],q[n].a);
}
int main(){
	n=read(),m=read();
	cmp=pow(n,0.666);
	for(i=1;i<=n;i++) a[i]=read();
	for(i=1;i<=m;i++){
		c=getchar();
		while(c!='Q' && c!='C') c=getchar();
		if(c=='Q'){
			d[++cntq].l=max(read(),1),d[cntq].r=min(read(),n),d[cntq].x=read();
			d[cntq].t=cntc,d[cntq].p=cntq;
		}
		else 
			q[++cntc].w=read(),q[cntc].a=read();
		
	}
	sort(d+1,d+1+cntq);
	for(i=1;i<=cntq;i++){
		while(l<d[i].l) del(l++);
		while(l>d[i].l) add(--l);
		while(r<d[i].r) add(++r);
		while(r>d[i].r) del(r--);
		while(rt<d[i].t) upd(++rt);
		while(rt>d[i].t) upd(rt--);
		ans[d[i].p]=rem[haxi(d[i].x)];
	}
	for(i=1;i<=cntq;i++) printf("%d\n",ans[i]);
	return 0;
}
2022/10/20 17:27
加载中...