欢迎使用本站,预祝练习时长两年半的选手们到成功! [本模块信息来自tem/def/head]

class124-125 平衡树 Treap zxy

时间:2024-08-02 21:26 作者:admin 点击:
#include cstdlib #include iostream #include queue using namespace std ; int n, a [ 500050 ],ans = 0 ; struct node { int num; int pri; //平衡树的权重 node * l = nullptr , * r = nullptr ; node ( int k ){ num = k; pri = rand (); } } * ro

#include <cstdlib>

#include <iostream>

#include <queue>

using namespace std;

int n,a[500050],ans=0;

struct node{

   int num;

   int pri;//平衡树的权重

   node *l=nullptr,*r=nullptr;

   node(int k){

       num=k;

       pri=rand();

   }

}*root=nullptr;//NULL nullptr

node* rightmove(node *p){

   node *x=p->l;

   p->l=x->r;

   x->r=p;

   return x;

}

node* leftmove(node *p){

   node *x=p->r;

   p->r=x->l;

   x->l=p;

   return x;

}

node* insert(node *p,int n){

   if(p==nullptr) return new node(n);

   if(n<p->num){

       p->l=insert(p->l,n);

       if(p->pri<p->l->pri) p=rightmove(p);//将左子变根

   }

   else if(n>=p->num){

       p->r=insert(p->r,n);

       if(p->pri<p->r->pri) p=leftmove(p);//将右子变根

   }

   return p;

}

int findl(node *p,int n){

   //求二叉搜索树中,比n小的最大的数字

   int ans=-999999999;

   while(p){

       if(p->num<=n) {

           ans=p->num;

           p=p->r;

       }

       else p=p->l;

   }

   return ans;

}

int findr(node *p,int n){

   //求二叉搜索树中,比n大的最小的数字

   int ans=999999999;

   while(p){

       if(p->num>=n) {

           ans=p->num;

           p=p->l;

       }

       else p=p->r;

   }

   return ans;

}

void cx(node *p){

   queue<node*> q;

   q.push(p);

   while(!q.empty()){

       node *u=q.front();

       cout<<u->num;

       q.pop();

       if(u->l) q.push(u->l);

       if(u->r) q.push(u->r);

   }

}

int main(){

   cin>>n;

   cin>>a[1];

   root=insert(root,a[1]);

   for(int i=2;i<=n;i++){

       cin>>a[i];

       ans+=min(a[i]-findl(root,a[i]),findr(root,a[i])-a[i]);

       root=insert(root,a[i]);

   }

   cout<<ans+a[1];

   return 0;

}

(责任编辑:admin)
    顶一下
    (0)
    0%
    踩一下
    (0)
    0%