FHQ-Treap 60分求助
查看原帖
FHQ-Treap 60分求助
677234
FstAutoMaton楼主2023/7/20 19:47

RT

#include <bits/stdc++.h>

using namespace std;

const int kMaxN = 1e5 + 5;

struct T {
  int x, y, l, r, c, s;
  T() {
    x = y = l = r = c = s = 0;
  }
} w[kMaxN];

int n, tot, rt, op, x;

void Push_up(int u) {
  u && (w[u].s = w[w[u].l].s + w[w[u].r].s + 1);
}

int Init(int x) {
  ++tot;
  w[tot].x = x, w[tot].y = rand(), w[tot].l = w[tot].r = 0, w[tot].c = w[tot].s = 1;
  return tot;
}

void Split(int u, int v, int &x, int &y) {  //  分裂
  if (u) {
    if (w[u].x <= v) {
      int r = w[x = u].r;
      Split(r, v, w[u].r = 0, y);
    } else {
      int l = w[y = u].l;
      Split(l, v, x, w[u].l = 0);
    }
    Push_up(u);
  } else {
    x = y = 0;
  }
}

int Merge(int u, int v) {
  if (!u || !v) {
    return u + v;
  } else {
    if (w[u].y >= w[v].y) {
      w[u].r = Merge(w[u].r, v);
      Push_up(u);
      return u;
    } else {
      w[v].l = Merge(u, w[v].l);
      Push_up(v);
      return v;
    }
  }
}

void Insert(int x) {
  int l = 0, r = 0;
  Split(rt, x, l, r);
  rt = Merge(Merge(l, Init(x)), r);
}

void Del(int &u, int x) {
  if (u) {
    if (w[u].x == x) {
      u = Merge(w[u].l, w[u].r);
    } else {
      if (w[u].x > x) {
        Del(w[u].l, x);
      } else {
        Del(w[u].r, x);
      }
      Push_up(u);
    }
  }
}

int Query_num(int u, int x) {
  if (!u) {
    return 0;
  } else if (x <= w[w[u].l].s) {
    return Query_num(w[u].l, x);
  } else if (w[w[u].l].s < x && x <= w[w[u].l].s + w[u].c) {
    return w[u].x;
  } else {
    return Query_num(w[u].r, x - w[w[u].l].s - w[u].c);
  }
}

int Query_Pl(int u, int x) {
  if (!u) {
    return 0;
  } else if (x == w[u].x && w[u].c) {
    return w[w[u].l].s;
  } else if (w[u].x < x) {
    return w[w[u].l].s + w[u].c + Query_Pl(w[u].r, x);
  } else {
    return Query_Pl(w[u].l, x);
  }
}

int Query_Pr(int u, int x) {
  if (!u) {
    return 1;
  } else if (x == w[u].x && w[u].c) {
    return w[w[u].l].s + w[u].c + 1;
  } else if (x < w[u].x) {
    return Query_Pr(w[u].l, x);
  } else {
    return w[w[u].l].s + w[u].c + Query_Pr(w[u].r, x);
  }
}

int Pre(int x) {
  return Query_num(rt, Query_Pl(rt, x));
}

int Back(int x) {
  return Query_num(rt, Query_Pr(rt, x));
}

int main() {
  srand(time(0));
  for (cin >> n; n; n--) {
    cin >> op >> x;
    if (op == 1) {
      Insert(x);
    } else if (op == 2) {
      Del(rt, x);
    } else if (op == 3) {
      cout << Query_Pl(rt, x) + 1 << "\n";
    } else if (op == 4) {
      cout << Query_num(rt, x) << "\n";
    } else if (op == 5) {
      cout << Pre(x) << "\n";
    } else {
      cout << Back(x) << "\n";
    }
  }
  return 0;
}
2023/7/20 19:47
加载中...