求助莫队
查看原帖
求助莫队
174806
xbb2楼主2022/7/30 16:16
#include<bits/stdc++.h>
using namespace std;
const int N=1e6;
int cnt1=0,cnt2=0,cnt3=0,n,m,maxx;
int a[N],cnt[N],ans[N];
map<int,int> mp;
struct tip_q{int l,r,k,id,t;}q[N];
struct tip_p{int a,k;}p[N];
inline bool cmp(tip_q a,tip_q b){//
    if(a.l/maxx!=b.l/maxx)return a.l<b.l;
    else if(a.r/maxx!=b.r/maxx)return a.r<b.r;
    else return a.t<b.t;
}
void del(int x){cnt[x]--;}
void add(int x){cnt[x]++;}
int main(){
	cin>>n>>m;maxx=pow(n,(double)2/(double)3);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
		if(mp.find(a[i])==mp.end())mp[a[i]]=++cnt3,a[i]=cnt3;
		else a[i]=mp[a[i]];
	}
	for(int i=1;i<=n;i++)printf("%d\n",a[i]);
	for(int i=1;i<=m;i++){
		char c;cin>>c;
		if(c=='Q'){
			cnt1++,scanf("%d%d%d",&q[cnt1].l,&q[cnt1].r,&q[cnt1].k),q[cnt1].id=cnt1,q[cnt1].t=cnt2;
			if(mp.find(q[cnt1].k)==mp.end())cnt3++,mp[q[cnt1].k]=cnt3,q[cnt1].k=cnt3;
			else q[cnt1].k=mp[q[cnt1].k];
		}
		else{
			cnt2++,scanf("%d%d",&p[cnt2].a,&p[cnt2].k);
			if(mp.find(p[cnt2].k)==mp.end())cnt3++,mp[p[cnt2].k]=cnt3,p[cnt2].k=cnt3;
			else p[cnt2].k=mp[p[cnt2].k];
		}
	}
	sort(q+1,q+1+cnt1,cmp);
	for(int i=1,l=1,r=0,t=0;i<=cnt1;i++){
		for(;t<q[i].t;){
			++t;if(l<=p[t].a&&p[t].a<=r)del(a[p[t].a]),swap(a[p[t].a],p[t].k),add(a[p[t].a]);
			else swap(a[p[t].a],p[t].k);
		}
		for(;t>q[i].t;){
			if(l<=p[t].a&&p[t].a<=r)del(a[p[t].a]),swap(a[p[t].a],p[t].k),add(a[p[t].a]);
			else swap(a[p[t].a],p[t].k);--t;
		}
        while(l>q[i].l)add(a[--l]);
        while(r<q[i].r)add(a[++r]);
        while(l<q[i].l)del(a[l++]);
        while(r>q[i].r)del(a[r--]);
        ans[q[i].id]=cnt[q[i].k];
	}
	for(int i=1;i<=cnt1;i++)printf("%d\n",ans[i]);
	return 0;
} 

样例过了,但WA

求助(刚学)

2022/7/30 16:16
加载中...