求助替罪羊
查看原帖
求助替罪羊
316827
Temperature_automata楼主2021/2/2 19:55

RT,代码查了2天没查出来错误 求检查

#include <iostream>
#include <cstdio>

using namespace std ;

const int N = 1e5 + 5 ;
const double ept = 0.75 ;
struct node {
  int l , r , val ;
  int size , fact ;
  bool exist ;
}tzy[N];
int n , root , cnt ;

void add_newnode(int &now , int val) {
  now=++cnt ;
  tzy[now].val = val ;
  tzy[now].size=tzy[now].fact = 1 ;
  tzy[now].exist=true ;
}

bool imbanlence(int now) 
{
  if(max(tzy[tzy[now].l].size,tzy[tzy[now].r].size)>tzy[now].size*ept
    ||tzy[now].size-tzy[now].fact>tzy[now].size*0.3)
    return true ;
  return false ;
}

#include <vector>
vector <int> v; 

void inBL(int now) {
  if(!now) return ;
  inBL(tzy[now].l);
  if(tzy[now].exist)
    v.push_back(now) ;
  inBL(tzy[now].r) ;
}

void lift ( int l , int r , int &now ) {
  if(l==r) {
    now = v[l] ;
    tzy[now].l=tzy[now].r=0;
    tzy[now].size=tzy[now].fact=1;
    return ;
  }
  int m = (l+r)>>1;
  while(l<m&&tzy[v[m]].val==tzy[v[m-1]].val) {
    m--;
  }
  now = v[m] ;
  if(l<m)
  lift(l,m-1,tzy[now].l);
  else tzy[now].l = 0;
  lift(m+1,r,tzy[now].r) ;
  tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
  tzy[now].fact=tzy[tzy[now].l].fact+tzy[tzy[now].r].fact+1;
}

void rebuild(int &now) 
{
  v.clear() ;
  inBL(now) ;
  if(v.empty())
  {
    now = 0 ;
    return ;
  }
  lift(0,v.size()-1,now) ;
}

void update (int now,int end) {
  if(!now) return ;
  if(tzy[end].val<tzy[now].val)
    update(tzy[now].l,end) ;
  else update(tzy[now].r,end) ;
  tzy[now].size=tzy[tzy[now].l].size+tzy[tzy[now].r].size+1;
}

void check ( int &now , int end ) {
  if(now==end) return ;
  if(imbanlence(now))
  {
    rebuild(now) ;
    update(root,now) ;
    return ;
  }
  if(tzy[end].val<tzy[now].val) 
    check(tzy[now].l,end) ;
  else check(tzy[now].r,end) ;
}

void insert ( int &now , int x ) {
  if(!now) {
    add_newnode(now,x) ;
    check(root,now) ;
    return ;
  }
  tzy[now].size++;
  tzy[now].fact++;
  if(x<tzy[now].val) 
    insert(tzy[now].l,x) ;
  else insert(tzy[now].r,x);
}

void del(int now,int x) {
  if(tzy[now].val==x&&tzy[now].exist) {
    tzy[now].fact--;
    tzy[now].exist = false ;
    check(root,now) ;
    return ;
  }
  tzy[now].fact--;
  if(x<tzy[now].val) 
    del(tzy[now].l,x) ;
  else del(tzy[now].r,x) ;
}

int getrank(int val) {
  int now = root , rank = 1 ;
  while(now) 
  {
    if(val>tzy[tzy[now].l].val)
    {
      rank+=tzy[tzy[now].l].fact+tzy[now].exist ;
      now = tzy[now].r ;
    }
    else now = tzy[now].l ;
  }
  return rank ;
}

int getnum(int rank) {
  int now = root ;
  while(now) {
    if(tzy[tzy[now].l].fact+tzy[now].exist==rank&&tzy[now].exist)
      break;
    else if(tzy[tzy[now].l].fact>=rank) {
      now = tzy[now].l ;
    }
    else rank-=tzy[tzy[now].l].fact+tzy[now].exist,now = tzy[now].r ;
  }
  return tzy[now].val;
}

int main ( ) {
  cin >> n ;
  while(n--) {
    int opt , x ;
    cin >> opt >> x ;
    switch(opt) {
      case 1 : 
        insert(root,x) ;
        break;
      case 2 :
        del(root,x) ;
        break;
      case 3 :
        cout << getrank(x) << endl ;
        break;
      case 4 :
        cout << getnum(x) << endl ;
        break;
      case 5 :
        cout << getnum(getrank(x)-1) <<endl ;
        break;
      case 6 :
        cout << getnum(getrank(x+1)) << endl ;
        break;
    }
  }
  //system("pause") ;
}
2021/2/2 19:55
加载中...