分块65pts求助,5个点RE
查看原帖
分块65pts求助,5个点RE
912779
isme1楼主2024/8/19 11:35
#include<bits/stdc++.h>
using namespace std;
int block,t,n,pos[20000005],num[5005],N=20000000,st[5005],ed[5005],mp[20000005],k=10000001,ans[100005];
void build(){
	block=(int)sqrt(N);
	t=N/block;
	if(N%block){
		t++;
	}
	for(int i=1;i<=t;i++){
		st[i]=(i-1)*block+1;
		ed[i]=i*block;
	}
	ed[t]=N;
	for(int i=1;i<=N;i++){
		pos[i]=(i-1)/block+1;
	}
}
void insert(int x){
	num[pos[x]]++;
}
void erase(int x){
	num[pos[x]]--;
}
int find_top(int x){
	int res=0,h=0,mk=0;
	for(int i=1;i<=t;i++){
		res+=num[i];
		if(res>=x){
			mk=i;
			break;
		}
		h=res;
	}
	int y=x-h;
	for(int i=st[mk];i<=ed[mk];i++){
		if(y==1&&mp[i]>0){
			return i;
		}
		y-=mp[i];
	}
}
int get_top(int l,int r){
	int p=pos[l];
	int q=pos[r];
	if(p==q){
		int res=0;
		for(int i=l;i<=r;i++){
			res+=mp[i];
		}
		return res;
	}
	else{
		int res=0;
		for(int i=l;i<=ed[p];i++){
			res+=mp[i];
		}
		for(int i=st[q];i<=r;i++){
			res+=mp[i];
		}
		for(int i=p+1;i<=q-1;i++){
			res+=num[i];
		}
		return res;
	}
}
int find1(int x){
	int p=pos[x];
	for(int i=p;i>=1;i--){
		if(num[i]>0){
			for(int j=x;j>=st[i];j--){
				if(mp[j]>0){
					return j;
				}
			}
		}
	}
}
int find2(int x){
	int p=pos[x];
	for(int i=p;i<=t;i++){
		if(num[i]>0){
			for(int j=x;j<=ed[i];j++){
				if(mp[j]>0){
					return j;
				}
			}
		}
	}
}
int main()
{
	build();
	int cnt=0;
	cin>>n;
	for(int i=1;i<=n;i++){
		int op,x;
		cin>>op>>x;
		if(op==1){
			insert(x+k);
			mp[x+k]++;
		}
		else if(op==2){
			erase(x+k);
			mp[x+k]--;
		}
		else if(op==3){
//			cout<<<<endl;
			ans[++cnt]=get_top(1,x+k-1)+1;
		}
		else if(op==4){
//			cout<<<<endl;
			ans[++cnt]=find_top(x)-k;
		}
		else if(op==5){
//			cout<<<<endl;
			ans[++cnt]=find1(x-1+k)-k;
		}
		else{
//			cout<<<<endl;	
			ans[++cnt]=find2(x+k+1)-k;
		}
	}
	for(int i=1;i<=cnt;i++){
		cout<<ans[i]<<endl;
	}
	return 0;
}

2024/8/19 11:35
加载中...