码迷,mamicode.com
首页 > 其他好文 > 详细

从零开始的异世界生活

时间:2018-01-14 22:49:46      阅读:220      评论:0      收藏:0      [点我收藏+]

标签:using   style   body   col   max   inf   for   space   bool   

#include<bits/stdc++.h>
using namespace std;
const int N=100000;
const int inf=2147483647;

int cnt=0;
int top=0;

struct treap{
  int ch[2],size,rd,val;
}t[N+10];

int gi(){
  int ans=0,f=1;char i=getchar();
  while(i<0||i>9){if(i==-)f=-1;i=getchar();}
  while(i>=0&&i<=9){ans=ans*10+i-0;i=getchar();}
  return ans*f;
}

void up(int i){
  t[i].size=t[t[i].ch[0]].size+t[t[i].ch[1]].size+1;
}

int rotate(int i,int dir){
  int child=t[i].ch[dir];
  t[i].ch[dir]=t[child].ch[dir^1];
  t[child].ch[dir^1]=i;
  up(i);up(child);
  return child;
}

int insert(int i,int val){
  if(!i){
    t[++cnt].rd=rand();
    t[cnt].val=val;
    t[cnt].size=1;
    return cnt;
  }
  t[i].size++; 
  bool dir=t[i].val<=val;
  t[i].ch[dir]=insert(t[i].ch[dir],val);
  if(t[i].rd>t[t[i].ch[dir]].rd)
  return rotate(i,dir);
  return i;
}

int pre_rank(int i,int val){
  if(!i)return -1;
  if(val==t[i].val)
  {
    int ans=pre_rank(t[i].ch[0],val);
    return ans==-1?i:ans;
  }
  if(t[i].val>val) return pre_rank(t[i].ch[0],val);
  return pre_rank(t[i].ch[1],val);
}

int get_rank(int i,int j,int val){
  if(i==j)return t[t[i].ch[0]].size+1;
  if(t[i].val>=val) return get_rank(t[i].ch[0],j,val);
  return get_rank(t[i].ch[1],j,val)+t[t[i].ch[0]].size+1;
}

int kth(int i,int k){
  if(t[t[i].ch[0]].size==k-1) return t[i].val;
  if(t[t[i].ch[0]].size>=k) return kth(t[i].ch[0],k);
  return kth(t[i].ch[1],k-t[t[i].ch[0]].size-1);
}

int delet(int i,int val){
  if(t[i].val==val)
  {
    if(t[i].ch[0]&&t[i].ch[1])
    {
      int son=t[i].ch[0],fa;
      while(t[son].ch[1])
      fa=son,son=t[son].ch[1],t[fa].size--;
      if(son==t[i].ch[0])
      {
    t[son].ch[1]=t[i].ch[1];
    t[son].rd=t[i].rd;
    t[son].size=t[i].size-1;
    return son;
      }
      t[fa].ch[1]=t[son].ch[0];
      t[son].ch[0]=t[i].ch[0];
      t[son].ch[1]=t[i].ch[1];
      t[son].rd=t[i].rd;
      t[son].size=t[i].size-1;
      return son;
    }
    if(t[i].ch[0]) return t[i].ch[0];
    return t[i].ch[1];
  }
  int dir=t[i].val<val;
  t[i].ch[dir]=delet(t[i].ch[dir],val);
  t[i].size--;
  return i;
}

int get_pre(int i,int val){
  if(!i) return -inf;
  if(t[i].val<val) return max(t[i].val,get_pre(t[i].ch[1],val));
  return get_pre(t[i].ch[0],val);
}

int get_next(int i,int val){
  if(!i) return inf;
  if(t[i].val>val) return min(t[i].val,get_next(t[i].ch[0],val));
  return get_next(t[i].ch[1],val);
}

int main(){
  srand(time(NULL));
  int opt = gi() , flag , x ;
  for(int i=1;i<=opt;i++){
    flag=gi(); x=gi();
    switch(flag){
    case 1:top=insert(top,x);break;
    case 2:top=delet(top,x);break;
    case 3:printf("%d\n",get_rank(top,pre_rank(top,x),x));break;
    case 4:printf("%d\n",kth(top,x));break;
    case 5:printf("%d\n",get_pre(top,x));break;
    case 6:printf("%d\n",get_next(top,x));break;
    }
  }
  return 0;
}

 

从零开始的异世界生活

标签:using   style   body   col   max   inf   for   space   bool   

原文地址:https://www.cnblogs.com/Lumberjack/p/8284345.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!