MnZn求调带修莫队(悬赏关注)
查看原帖
MnZn求调带修莫队(悬赏关注)
311306
dk_qwq楼主2022/9/16 21:28

WA+RE+TLE真的好折磨aaaa

https://www.luogu.com.cn/record/86765212

#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int N=1e6+5,M=1e6+5;
int pos[N];
struct ask{
	int l,r;
	int pre;
	int id;
	int ans;
}a[N];
bool cmp_section(const ask& a,const ask& b){
	if(pos[a.l]!=pos[b.l]) return pos[a.l]<pos[b.l];
	if(pos[a.r]!=pos[b.r]) return pos[a.r]<pos[b.r];
	return a.pre<b.pre;
}
bool cmp_id(const ask& a,const ask& b){
	return a.id<b.id;
}
struct change{
	int p,col;
	int id;
}b[N];
int al,bl;
int n,m;
int v[N];
int cnt[M];
int ans;
int l=1,r=0;
void add(int k){
	if(!cnt[v[k]]) ans++;
	cnt[v[k]]++;
}
void del(int k){
	cnt[v[k]]--;
	if(!cnt[v[k]]) ans--;
}
void updata(int k,int add){
	ans-=cnt[v[k]]>0;
	cnt[v[k]]+=add;
	ans+=cnt[v[k]]>0;
}
void change(int ql,int qr,int j){
	int k=b[j].p,&col=b[j].col;
	if(ql<=k&&k<=qr){
		ans-=!--cnt[v[k]];
		ans+=!cnt[col]++;
	}
	swap(v[k],col);
}
void solve(){
	int j=0;
	for(int i=1;i<=al;i++){
		int ql=a[i].l,qr=a[i].r;
		for(;l>ql;l--) add(l-1);
		for(;l<ql;l++) del(l);
		for(;r<qr;r++) add(r+1);
		for(;r>qr;r--) del(r);
		while(a[i].id>b[j].id) change(ql,qr,++j);
		while(a[i].id<b[j].id) change(ql,qr,j--);
		a[i].ans=ans;
	}
}
int main() {
	scanf("%d%d",&n,&m);
//	int block=sqrt(n);
	int block=pow(n,2.0/3.0);
	for(int i=1;i<=n;i++)
		pos[i]=(i-1)/block+1;
	for(int i=1;i<=n;i++) scanf("%d",&v[i]);
	for(int i=1;i<=m;i++){
		scanf("\n");
		if(getchar()=='R'){
			bl++;
			scanf("%d%d",&b[bl].p,&b[bl].col);
			b[bl].id=i;
		}
		else{
			al++;
			scanf("%d%d",&a[al].l,&a[al].r);
			a[al].id=i;
			a[al].pre=bl;
		}
	}
	sort(a+1,a+1+al,cmp_section);
	solve();
	sort(a+1,a+1+al,cmp_id);
	for(int i=1;i<=al;i++)
		printf("%d\n",a[i].ans);
}
2022/9/16 21:28
加载中...