简单莫队 WA 20pts 求调 qwq
查看原帖
简单莫队 WA 20pts 求调 qwq
511609
无钩七不改名楼主2023/8/19 12:39

RT。

#include<bits/stdc++.h>
using namespace std;

const int N=100005;

int n,m,sz,a[N];
int xga[N],xgp[N],xgy[N],cnt,cnt2;
int num[N<<1],lsh[N<<1],qwq;
struct ak{
	int l,r,k;
	int kl,kr,t,num;
}c[N];
int ans[N];

int read(){
	int f=1,k=0;
	char c=getchar();
	while(c<'0'||c>'9'){
		if(c=='-')f=-1;
		c=getchar();
	} 
	while(c>='0'&&c<='9'){
		k=k*10+c-'0';
		c=getchar();
	}
	return f*k;
}

bool cmp(ak aaa,ak bbb){
	if(aaa.kl!=bbb.kl)return aaa.kl<bbb.kl;
	if(aaa.kr!=bbb.kr)return aaa.kr<bbb.kr;
	return aaa.t<bbb.t;
}

int main(){
	n=read();m=read();
	sz=pow(n,2.0/3.0);
	for(int i(1);i<=n;++i)a[i]=read();
	for(int i(1);i<=n;++i)lsh[++qwq]=a[i];
	while(m--){
		char cc;scanf(" %c",&cc);
		if(cc=='Q'){
			c[++cnt2].l=read();
			c[cnt2].r=read();
			c[cnt2].k=read();
			
			c[cnt2].kl=c[cnt2].l/sz;
			c[cnt2].kr=c[cnt2].r/sz;
			
			c[cnt2].t=cnt;
			c[cnt2].num=cnt2;
			
			lsh[++qwq]=c[cnt2].k;
		}
		else{
			xga[++cnt]=read();
			xgp[cnt]=read();
			xgy[cnt]=a[xga[cnt]];
			lsh[++qwq]=xgp[cnt];
		}
	}sort(lsh+1,lsh+1+qwq);
	qwq=unique(lsh+1,lsh+1+qwq)-lsh-1;
	for(int i(1);i<=n;++i)a[i]=lower_bound(lsh+1,lsh+1+qwq,a[i])-lsh; 
	for(int i(1);i<=cnt;++i){
		xgp[i]=lower_bound(lsh+1,lsh+1+qwq,xgp[i])-lsh; 
		xgy[i]=lower_bound(lsh+1,lsh+1+qwq,xgy[i])-lsh; 
	}
	for(int i(1);i<=cnt2;++i)c[i].k=lower_bound(lsh+1,lsh+1+qwq,c[i].k)-lsh; 
	sort(c+1,c+1+cnt2,cmp);
	int L=c[1].l,R=c[1].r,t=c[1].t;
	for(int i(1);i<=t;++i)a[xga[i]]=xgp[i];
	for(int i(L);i<=R;++i)++num[a[i]];
	ans[c[1].num]=num[c[1].k];
	for(int i(2);i<=cnt2;++i){
		while(L>c[i].l){
			--L;
			++num[a[L]];
		}
		while(L<c[i].l){
			--num[a[L]];
			++L;
		}
		while(R>c[i].r){
			--num[a[R]];
			--R;
		}
		while(R<c[i].r){
			++R;
			++num[a[R]];
		}
		
	//	cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<c[i].k<<" "<<num[c[i].k]<<'\n';
		
		while(t>c[i].t){
			a[xga[t]]=xgy[t];
			if(xga[t]>R||xga[t]<L){
				--t;continue;
			}
			--num[xgp[t]];
			++num[xgy[t]];;
			--t;
		}
		
	//	cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<num[c[i].k]<<'\n';
		
		while(t<c[i].t){
			++t;
			a[xga[t]]=xgp[t];
			if(xga[t]>R||xga[t]<L)continue;
			++num[xgp[t]];
			--num[xgy[t]];
		}
		
		ans[c[i].num]=num[c[i].k];
		
	//	cout<<c[i].num<<" "<<L<<" "<<R<<" "<<t<<" "<<num[c[i].k]<<'\n';
	}
	for(int i(1);i<=cnt2;++i)printf("%d\n",ans[i]);
	return 0;
}

代码会输出负数 TMT

thx qwq

2023/8/19 12:39
加载中...