求调 Splay 3AC 5TLE 2MLE 2RE
查看原帖
求调 Splay 3AC 5TLE 2MLE 2RE
363006
wangyibo201026楼主2022/8/1 10:59

代码:

#define debug
#include<bits/stdc++.h>

#define endl '\n';

using namespace std;

const int N = 5e5 + 5;

int n;

struct Node{
  int l, r;
  int val, size;
  int cnt;
}spl[N];

int cnt, root;

void newnode(int &node, int &val){
  spl[node = ++cnt].val = val;
  spl[cnt].size++;
  spl[cnt].cnt++;
}

void update(int node){
  spl[node].size = spl[spl[node].l].size + spl[spl[node].r].size + spl[node].cnt;
}

void zig(int &node){
  int l = spl[node].l;
  spl[node].l = spl[l].r;
  spl[l].r = node;
  node = l;
  update(spl[node].r);
  update(node);
}

void zag(int &node){
  int r = spl[node].r;
  spl[node].r = spl[r].l;
  spl[r].l = node;
  node = r;
  update(spl[node].l);
  update(node);
}

void splaying(int x, int &y){ //伸展
  if(x == y){
    return ;
  }
  int &l = spl[y].l, &r = spl[y].r;
  if(x == l){
    zig(y);
  }
  else if(x == r){
    zag(y);
  }
  else{
    if(spl[x].val < spl[y].val){
      if(spl[x].val < spl[l].val){
        splaying(x, spl[l].l);
        zig(y);
        zig(y);
      }
      else{
        splaying(x, spl[l].r);
        zag(l);
        zig(y);
      }
    }
    else{
      if(spl[x].val > spl[r].val){
        splaying(x, spl[r].r);
        zag(y);
        zag(y);
      }
      else{
        splaying(x, spl[r].l);
        zig(r);
        zag(y);
      }
    }
  }
}

void delnode(int node){
  splaying(node, root);
  if(spl[node].cnt > 1){
    spl[node].size--;
    spl[node].cnt--;
  }
  else if(spl[root].r){
    int p = spl[root].r;
    while(spl[p].l){
      p = spl[p].l;
    }
    splaying(p, spl[root].r);
    spl[spl[root].r].l = spl[root].l;
    root = spl[root].r;
    update(root);
  }
  else{
    root = spl[root].l;
  }
}

void insert(int &node, int &val){
  if(!node){
    newnode(node, val);
    splaying(node, root);
  }
  else if(val < spl[node].val){
    insert(spl[node].l, val);
  }
  else if(val > spl[node].val){
    insert(spl[node].r, val);
  }
  else{
    spl[node].size++;
    spl[node].cnt++;
    splaying(node, root);
  }
}

void del(int node, int val){
  if(spl[node].val == val){
    delnode(node);
  }
  else if(val < spl[node].val){
    del(spl[node].l, val);
  }
  else{
    del(spl[node].r, val);
  }
}

int _rank(int val){
  int node = root, rk = 1;
  while(node){
    if(spl[node].val == val){
      rk += spl[spl[node].l].size;
      splaying(node, root);
      break;
    }
    if(val <= spl[node].val){
      node = spl[node].l;
    }
    else{
      rk += spl[spl[node].l].size + spl[node].cnt;
      node = spl[node].r;
    }
  }
  return rk;
}

int query(int rk){
  int node = root;
  while(node){
    int lsize = spl[spl[node].l].size;
    if(lsize + 1 <= rk && rk <= lsize + spl[node].cnt){
      splaying(node, root);
      break;
    }
    else if(lsize >= rk){
      node = spl[node].l;
    }
    else{
      rk -= lsize + spl[node].cnt;
      node -= spl[node].r;
    }
  }
  return spl[node].val;
}

void Solve(){
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  cin >> n;
  while(n--){
    int op;
    cin >> op;
    if(op == 1){
      int x;
      cin >> x;
      insert(root, x);
    }
    else if(op == 2){
      int x;
      cin >> x;
      del(root, x);
    }
    else if(op == 3){
      int x;
      cin >> x;
      cout << _rank(x) << endl;
    }
    else if(op == 4){
      int x;
      cin >> x;
      cout << query(x) << endl;
    }
    else if(op == 5){
      int x;
      cin >> x;
      cout << query(_rank(x) - 1) << endl;
    }
    else{
      int x;
      cin >> x;
      cout << query(_rank(x + 1)) << endl;
    }
  }
}

signed main(){
#ifdef debug
  freopen("Code.in", "r", stdin);
  freopen("Code.out", "w", stdout);
#endif
  Solve();
  return 0;
}
2022/8/1 10:59
加载中...