【玄关】【48pts求调】分块+bitset TLE
查看原帖
【玄关】【48pts求调】分块+bitset TLE
916130
SuperChao楼主2023/9/7 17:48

代码如下

#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
using ll = long long;
#define maxn 133333
#define maxk 400
ll n,m,len,k;
ll a[maxn],F[maxn];
ll L[maxk],R[maxk];
unordered_map<int,int> unmap[maxk];
bitset<1000001> bs[maxk];

void build(){
	len=sqrt(n),k=(n+len-1)/len;
	for(int i=1;i<=k;i++)L[i]=R[i]+1,R[i]=L[i]+len-1;
	R[k]=n;
	for(int i=1;i<=k;i++)
		for(int j=L[i];j<=R[i];j++){
			F[j]=i,bs[i][a[j]]=1,unmap[i][a[j]]++; 
		}
}
void update(int x,int y){
	bs[F[x]][y]=1;
	if(--unmap[F[x]][a[x]])bs[F[x]][a[x]]=0;
	a[x]=y;
	return;
}
bitset<1000001> query(int l,int r){
	bitset<1000001> res;
	if(F[l]==F[r]){
		for(int i=l;i<=r;i++)res[a[i]]=1;
		return res;
	}
	res=query(l,R[F[l]])|query(L[F[r]],r);
	for(int i=F[l]+1;i<F[r];i++){
		res=res|bs[i];
	}
	return res;
}
int main(){
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	cin>>n>>m;
	for(int i=1;i<=n;++i)cin>>a[i];
	build();
	for(int i=1,x,y;i<=m;++i){
		char opt;
		cin>>opt;
		if(opt=='Q'){
			cin>>x>>y;
			cout<<query(x,y).count()<<'\n';
		}else{
			cin>>x>>y;
			update(x,y);
		}
	} 
	return 0;
} 

unordered_map是用来方便判断删去某个数之后区间是否还有这个数,如果不用unordered_map还会TLE#8

玄关,明天回

2023/9/7 17:48
加载中...