树状数组93分
查看原帖
树状数组93分
690320
MoGuYun_12楼主2024/8/13 08:48

模考时平衡树忘了,想用树状数组骗分

#include <bits/stdc++.h>

using namespace std;
#define N 10000001

int n,book[N],c[N];

void add(int x,int k){for(int i=x;i<=1000001;i+=(i&-i)) c[i]+=k;}
int getsum(int x){
	int res=0;
	for(int i=x;i;i-=(i&-i)) res+=c[i];
	return res;
}

int main()
{

	cin>>n;
	for(int i=1;i<=n;i++){
		int opt,x; cin>>opt>>x;
		if(opt==1){
			add(x,1); book[x]++;
		}else if(opt==2){
			add(x,-1); book[x]--;
		}else if(opt==3){
			cout<<getsum(x-1)+1<<endl;
		}else if(opt==4){
			int l=1,r=1000001;
			while(l<r){
				int mid=(l+r)>>1;
				if(getsum(mid)>=x) r=mid;
				else l=mid+1;
			}
			cout<<l<<endl;
		}else if(opt==5){
			for(int i=x-1;i>=1;i--){
				if(book[i]){
					cout<<i<<endl;
					break;
				}
			}
		}else{
			for(int i=x+1;i<=1000001;i++){
				if(book[i]){
					cout<<i<<endl;
					break;
				}
			}
		}
	}
	return 0;
}

2024/8/13 08:48
加载中...