带修莫队34pts求助
查看原帖
带修莫队34pts求助
448483
honghaojin楼主2024/2/24 17:56

1~11TLE

照着第一篇题解写的,看起来和题解没啥区别啊

#include<bits/stdc++.h>
using namespace std;
const int N=2e5+10,M=1e6+10;
int sz,res,a[N],c[M],ans[N];
struct Query{
	int l,r,t,id;
	bool operator <(const Query &x)const{
		return l/sz==x.l/sz?r/sz==x.r/sz?t<x.t:r<x.r:l<x.r;
	}
}qr[N];
struct Update{
	int p,c;
}ud[N];
inline void add(int x){
	res+=!c[x]++;
}
inline void del(int x){
	res-=!--c[x];
}
inline void upd(int l,int r,int t){
	if(l<=ud[t].p&&ud[t].p<=r){
		del(a[ud[t].p]);
		add(ud[t].c);
	}
	swap(a[ud[t].p],ud[t].c);
}
int main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n,m;
	cin>>n>>m;
	sz=pow(n,2.0/3);
	for(int i=1;i<=n;++i){
		cin>>a[i];
	}
	int q=0,u=0;
	char op;
	while(m--){
		cin>>op;
		if(op=='Q'){
			qr[++q].t=u,qr[q].id=q;
			cin>>qr[q].l>>qr[q].r;
		}else{
			++u;
			cin>>ud[u].p>>ud[u].c;
		}
	}
	sort(qr+1,qr+q+1);
	for(int i=1,l=1,r=0,t=0;i<=q;++i){
		while(l<qr[i].l)del(a[l++]);
		while(l>qr[i].l)add(a[--l]);
		while(r<qr[i].r)add(a[++r]);
		while(r>qr[i].r)del(a[r--]);
		while(t<qr[i].t)upd(l,r,++t);
		while(t>qr[i].t)upd(l,r,t--);
		ans[qr[i].id]=res;
	}
	for(int i=1;i<=q;++i){
		cout<<ans[i]<<'\n';
	}
	return 0;
}
2024/2/24 17:56
加载中...