带修莫队求调
查看原帖
带修莫队求调
261417
asasas楼主2022/8/30 23:00

RT.

#include <bits/stdc++.h>
using namespace std;
#define ll long long
struct as{
	int l,r,id,la;
}ans1[260005];
int n,kuai,m;
map<int,int> vis;
int a[260000],mcqh[260000];
struct czmg{
	int p,col;
}ans2[260005];
int l,r;
bool cmp(as a,as b){
	int l1=(a.l-1)/kuai+1,l2=(b.l-1)/kuai+1;
	int r1=(a.r-1)/kuai+1,r2=(b.r-1)/kuai+1;
	return l1^l2?l1<l2:(r1^r2?r1<r2:a.la<b.la);
} 
int cnt=0;
inline void add(int u){
	++vis[a[u]];
	if (vis[a[u]]==1) cnt++;
	if (vis[a[u]]==2) cnt--;
}
inline void del(int u){
	--vis[a[u]];
	if (vis[a[u]]==0) cnt--;
	if (vis[a[u]]==1) cnt++;
}
inline void change(int l,int r,int t){
	if (ans2[t].p>=l&&ans2[t].p<=r){
		--vis[a[ans2[t].p]];
		++vis[ans2[t].col];
		if (vis[a[ans2[t].p]]==0) cnt--;
		if (vis[a[ans2[t].p]]==1) cnt++;
		if (vis[ans2[t].col]==1) cnt++;
		if (vis[ans2[t].col]==2) cnt--;
	}
	swap(ans2[t].col,a[ans2[t].p]);
}
int main(){
    cin >> n >> m;
    kuai=(int)pow(1.0*n,2.0/3.0);
    for (register int i=1;i<=n;i++){
    	cin >> a[i];
    }
    int len1=0,len2=0;
    for (register int i=1;i<=m;i++){
    	int qwq;
    	cin >> qwq;
    	if (qwq==2){
    		int l,r;
    		cin >> l >> r;
    		l++,r++;
    		ans1[++len1].l=l,ans1[len1].r=r;
    		ans1[len1].id=len1,ans1[len1].la=len2; 
    	}
    	else {
    		int p,col;
    		cin >> p >> col;
    		p++;
    		ans2[++len2].p=p,ans2[len2].col=col;
    	}
    }
    sort(ans1+1,ans1+1+len1,cmp);
    l=1,r=0;
    int t=0;
    for (register int i=1;i<=len1;i++){
	    while(l>ans1[i].l) add(--l);
    	while(l<ans1[i].l) del(l++);
		while(r>ans1[i].r) del(r--);
    	while(r<ans1[i].r) add(++r);
    	while(t<ans1[i].la) change(l,r,++t);
    	while(t>ans1[i].la) change(l,r,t--);
    	mcqh[ans1[i].id]=cnt;
    }
    for (register int i=1;i<=len1;i++){
    	cout << mcqh[i] << endl;
    }
    return 0;
}

2022/8/30 23:00
加载中...