60pts 对拍之后发现问题出在3、4,不知道咋整
查看原帖
60pts 对拍之后发现问题出在3、4,不知道咋整
504403
VDLevUp楼主2023/6/23 09:28
#include<cstdio>
#include<cstdlib>
#include<ctime>
enum rotate_dir{left=1,right=0};
template<typename T>
class BSTree{
    private:
        struct Node{
            T val;
            Node* ch[2];
            int size,amount,prio;
            Node(){
                ch[0]=ch[1]=NULL;
                size=amount=1;
                prio=rand();
            }
            void updateSize(){
                size=amount;
                if(ch[0])
                    size+=ch[0]->size;
                if(ch[1])
                    size+=ch[1]->size;
            }
        }*root;
        void rotate(Node*& u,rotate_dir dir){
        	Node *tmp=u->ch[dir];
        	u->ch[dir]=tmp->ch[dir^1];
        	tmp->ch[dir^1]=u;
        	tmp->updateSize();
        	u->updateSize();
        	u=tmp;
		}
        void Insert(Node*& u,T val){
            if(!u){
                u=new Node();
                u->val=val;
                return;
            }
            if(u->val==val)
                u->amount++,u->size++;
            else if(u->val<val){
            	Insert(u->ch[1],val);
            	if(u->prio>u->ch[1]->prio)
            		rotate(u,left);
            	u->updateSize();
			}
            else{
            	Insert(u->ch[0],val);
            	if(u->prio>u->ch[0]->prio)
            		rotate(u,right);
            	u->updateSize();
			}
        }
        void Erase(Node*& u,T val){
        	if(!u)
        		return;
        	if(u->val>val)
        		Erase(u->ch[0],val),u->updateSize();
        	else if(u->val<val)
        		Erase(u->ch[1],val),u->updateSize();
        	else if(u->val==val){
        		if(u->amount>1){
        			u->amount--;
        			return;
				}
				Node* tmp=u;
				unsigned int cs=0|(u->ch[0]!=NULL)|((u->ch[1]!=NULL)<<1);
        		switch(cs){
        			case 0:delete u;u=NULL;break;
        			case 1:u=tmp->ch[0];delete tmp;break;
        			case 2:u=tmp->ch[1];delete tmp;break;
        			case 3:{
        				if(u->ch[0]->prio<u->ch[1]->prio)
        					rotate(u,right),Erase(u->ch[1],val);
        				else
        					rotate(u,left),Erase(u->ch[0],val);
        				u->updateSize();
						break;
					}
				}
			}
		}
        void dfs(Node* u){
            if(!u)
                return;
            dfs(u->ch[0]);
            for (int i=0;i<u->amount;i++) 
				printf("%d ",u->val);
            dfs(u->ch[1]);
        }
        int Rank(Node* u,T val){
            if(!u)
                return 0;
            int siz=u->ch[0]?(u->ch[0]->size+1):1;
            if(u->val<val)
                return siz+Rank(u->ch[1],val);
            if(u->val==val)
                return siz;
            if(u->val>val){
                return Rank(u->ch[0],val);
            }
        }
        T Kth(Node* u,int rk){
            if(!u)
                return 2147483647;
            int siz=u->ch[0]?u->ch[0]->size+1:1;
            if(rk==siz)
                return u->val;
            else if(rk<siz)
                return Kth(u->ch[0],rk);
            else
                return Kth(u->ch[1],rk-siz);
        }
        T Lower_bound(Node* u,T val,T tmp){
            if(!u)
                return tmp;
            if(u->val<val)
                return Lower_bound(u->ch[1],val,u->val);
            if(u->val>=val)
                return Lower_bound(u->ch[0],val,tmp);
        }
        T Upper_bound(Node* u,T val,T tmp){
            if(!u)
                return tmp;
            if(u->val>val)
                return Upper_bound(u->ch[0],val,u->val);
            if(u->val<=val)
                return Upper_bound(u->ch[1],val,tmp);
        }
    public:
        BSTree(){
            root=NULL;
            srand(time(0));
        }
        void insert(T val){
            Insert(root,val);
        }
        void erase(T val){
        	Erase(root,val);
		}
        int rank(T val){
            return Rank(root,val);
        }
        T kth(int rk){
            return Kth(root,rk);
        }
        T lower_bound(T val){
            return Lower_bound(root,val,-2147483647);
        }
        T upper_bound(T val){
            return Upper_bound(root,val,2147483647);
        }
        void show(){
            dfs(root);
        }
        int size(){
            return root?root->size-1:0;
        }
};
BSTree<long long>h;
int q,a;
long long x;
int main(){
    scanf("%d",&q);
    while(q--){
        scanf("%d%lld",&a,&x);
        switch(a){
            case 3:printf("%d\n",h.rank(x));break;
            case 4:printf("%lld\n",h.kth(x));break;
            case 5:printf("%lld\n",h.lower_bound(x));break;
            case 6:printf("%lld\n",h.upper_bound(x));break;
            case 1:h.insert(x);break;
            case 2:h.erase(x);break; 
        }
    }
    return 0;
}
2023/6/23 09:28
加载中...