替罪羊 WA 79pts on #10,#11,#12求调
查看原帖
替罪羊 WA 79pts on #10,#11,#12求调
1251229
zhaohongdi114514楼主2024/8/24 17:07
#include<bits/stdc++.h>
using namespace std;
template<typename T>
inline void read(T &x){
	x=0;
	bool flag=false;
	char c=getchar();
	while (c<'0' || c>'9'){
		flag^=(c=='-');
		c=getchar();
	}
	while (c>='0' && c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x=flag?-x:x;
}
template<typename T>
inline void write(T x){
	if (x<0){
		putchar('-');
		x=-x;
	}
	if (x>9) write(x/10);
	putchar(x%10+'0');
}
template<typename T>
inline void write(T x,char c){
	write(x),putchar(c);
}
template<typename Ty=int,Ty MIN=INT_MIN+1,Ty MAX=INT_MAX>
class ScapegoatTree{
	#define alpha (0.6)
	private:
		struct Node{
			Node *l,*r;
			int size;
			int nodecnt;
			bool deleted;
			Ty val;
			bool check(){
				return (l->nodecnt)>(alpha*nodecnt) || (r->nodecnt)>(alpha*nodecnt);
			}
			void pushup(){
				size=(!deleted)+l->size+r->size;
				nodecnt=1+l->nodecnt+r->nodecnt;
			}
		};
		typedef Node* nodeptr;
		nodeptr null;
		nodeptr newNode(Ty v=Ty()){
			nodeptr ans=new Node;
			ans->l=ans->r=null;
			ans->val=v;
			ans->deleted=false;
			ans->pushup();
			return ans;
		}
		nodeptr root=null;
		void disassemble(nodeptr p,vector<nodeptr> &vec){
			if (p==null) return;
			disassemble(p->l,vec);
			if (!p->deleted) vec.push_back(p);
			disassemble(p->r,vec);
			if (p->deleted) delete p;
		}
		nodeptr structure(vector<nodeptr> &vec,int l,int r){
			if (l>=r) return null;
			int mid=(l+r)>>1;
			nodeptr nxt=vec[mid];
			nxt->l=structure(vec,l,mid);
			nxt->r=structure(vec,mid+1,r);
			nxt->pushup();
			return nxt;
		}
		void restructure(nodeptr &p){
			vector<nodeptr> vec;
			disassemble(p,vec);
			p=structure(vec,0,vec.size());
		}
		void insert(nodeptr &p,Ty v){
			if (p==null){
				p=newNode(v);
				return;
			}
			p->size++;
			p->nodecnt++;
			if (p->val<v) insert(p->r,v);
			else insert(p->l,v);
			if (p->check()) restructure(p);
		}
		void erase(nodeptr &p,Ty v){
			if (p==null) return;
			if (p->val<v) erase(p->r,v);
			else if (v<p->val) erase(p->l,v);
			else if (!p->deleted) p->deleted=true;
			else erase(p->l,v);
			p->size--;
		}
		int getrank(nodeptr p,Ty v){
			int ans=1;
			while (p!=null){
				if (p->val<v){
					ans+=p->l->size+!p->deleted;
					p=p->r;
				}
				else p=p->l;
			}
			return ans;
		}
		Ty getval(nodeptr p,int k){
			while (p!=null){
				if (!p->deleted && p->l->size+(!p->deleted)==k) return p->val;
				if (p->l->size<k){
					k-=p->l->size+(!p->deleted);
					p=p->r;
				}
				else p=p->l;
			}
		}
		void debug(nodeptr p){
			if(p==null) return;
			debug(p->l);
			write(p->val,' ');
			debug(p->r);
		}
		Ty getpre(nodeptr p,Ty v){
			if (p==null) return MIN;
			if (p->val<v) return max(!p->deleted?p->val:MIN,getpre(p->r,v));
			else if (v<p->val) return getpre(p->l,v);
			else return getpre(p->l,v);
		}
		Ty getaft(nodeptr p,Ty v){
			if (p==null) return MAX;
			if (p->val<v) return getaft(p->r,v);
			else if (v<p->val) return min(!p->deleted?p->val:MAX,getaft(p->l,v));
			else return getaft(p->r,v);
		}
	public:
		ScapegoatTree(){
			null=new Node;
			null->l=null->r=null;
			null->val=Ty();
			null->deleted=false;
			null->size=0;
			null->nodecnt=0;
			root=null;
		}
		void insert(Ty v){
			insert(root,v);
		}
		void erase(Ty v){
			erase(root,v);
		}
		int getrank(Ty v){
			return getrank(root,v);
		}
		Ty getval(int k){
			return getval(root,k);
		}
		Ty getpre(Ty x){
			return getval(getrank(x)-1);
		}
		Ty getaft(Ty x){
			return getval(getrank(x+1));
		}
		void debug(){
			debug(root);
			putchar('\n');
		}
	#undef alpha
};
ScapegoatTree<int> st;
int n,opt,x;
signed main(){
	read(n);
	while (n--){
		read(opt),read(x);
		if (opt==1) st.insert(x);
		if (opt==2) st.erase(x);
		if (opt==3) write(st.getrank(x),'\n');
		if (opt==4) write(st.getval(x),'\n');
		if (opt==5) write(st.getpre(x),'\n');
		if (opt==6) write(st.getaft(x),'\n');
		if (opt==7) st.debug();
	}
}
2024/8/24 17:07
加载中...