58pts WA 求调 马蜂(或许)良好
查看原帖
58pts WA 求调 马蜂(或许)良好
524091
dami826楼主2024/10/21 22:35
#include<bits/stdc++.h>
#define OK puts("OK");
using namespace std;
struct node{
	int op,x;
	bool operator <(const node o)const{
		return x<o.x;
	}
};
node opt[200001];
int n;
map<int,int>mp;
map<int,int>mp2;
priority_queue<int,vector<int>,greater<int> >qu;
bool mp3[1000001];
struct segment_tree{
	int tree[1600001],lazy[1600001];
	inline void down(int index,int mid,int left,int right){
		lazy[index<<1]+=lazy[index];
		lazy[(index<<1)+1]+=lazy[index];
		tree[index<<1]+=lazy[index]*(mid-left+1);
		tree[(index<<1)+1]+=lazy[index]*(right-mid);
		lazy[index]=0;
	}
	void update(int gleft,int gright,int index,int x,int left,int right){
		if(gleft<=left&&right<=gright){
			tree[index]+=(x*(right-left+1));
			lazy[index]+=x;
			return;
		}
		if(right<gleft||gright<left){
			return;
		}
		int mid=(left+right)>>1;
		down(index,mid,left,right);
		update(gleft,gright,index<<1,x,left,mid);
		update(gleft,gright,(index<<1)+1,x,mid+1,right);
		tree[index]=tree[index<<1]+tree[(index<<1)+1];
	}
	int search(int gleft,int gright,int index,int left,int right){
		if(left>gright||right<gleft){
			return 0;
		}
		if(left>=gleft&&right<=gright){
			return tree[index];
		}
		else{
			int mid=(left+right)>>1;
			down(index,mid,left,right);
			return search(gleft,gright,index<<1,left,mid)+search(gleft,gright,(index<<1)+1,mid+1,right);
		}
	}
}; 
segment_tree tr;
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d %d",&opt[i].op,&opt[i].x);
		if(opt[i].op==1||opt[i].op==3||opt[i].op==5||opt[i].op==6){
			qu.push(opt[i].x);
		}
	}
	int cnt=1,cnt2=1;
	int pre;
	while(!qu.empty()){
		int x=qu.top();
		qu.pop();
		if(x>pre){
			cnt2++;
		}
		mp[x]=cnt2;
		mp2[cnt2]=x;
		cnt++;
		pre=x;
	}
	for(int i=1;i<=n;i++){
		if(opt[i].op==1){
			tr.update(mp[opt[i].x],mp[opt[i].x],1,1,1,n);
			mp3[mp[opt[i].x]]=true;
		}
		if(opt[i].op==2){
			tr.update(mp[opt[i].x],mp[opt[i].x],1,-1,1,n);
			mp3[mp[opt[i].x]]=false;
		}
		if(opt[i].op==3){
			printf("%d\n",tr.search(1,mp[opt[i].x]-1,1,1,n)+1);
		}
		if(opt[i].op==4){
			int l=1,r=n;
			while(l<=r){
				int mid=(l+r)/2;
				if(tr.search(1,mid-1,1,1,n)<opt[i].x){
					l=mid+1;
				}
				else{
					r=mid-1;
				}
			}
			while(!mp3[l-1]){
				l++;
			}
			printf("%d\n",mp2[l-1]);
		}
		if(opt[i].op==5){
			int l=1,r=mp[opt[i].x]-1;
			while(l<=r){
				int mid=(l+r)/2;
				if(tr.search(mid,opt[i].x-1,1,1,n)==0){
					r=mid-1;
				}
				else{
					l=mid+1;
				}
			}
			while(!mp3[l-1]){
				l--;
			}
			printf("%d\n",mp2[l-1]);
		}
		if(opt[i].op==6){
			int l=mp[opt[i].x]+1,r=n;
			while(l<=r){
				int mid=(l+r)/2;
				if(tr.search(mp[opt[i].x]+1,mid,1,1,n)==0){
					l=mid+1;
				}
				else{
					r=mid-1;
				}
			}
			while(!mp3[r+1]){
				r--;
			}
			printf("%d\n",mp2[r+1]);
		}
	}
	return 0;
}
2024/10/21 22:35
加载中...