样例有误

P5076 【深基16.例7】普通二叉树(简化版)

orz
by impuk @ 2020-05-02 16:46:15


>orz ???
by LJC00175 @ 2020-05-02 16:46:48


@[LJC00175](/user/91819) 样例没问题,只是数据有点玄学
by andyli @ 2020-05-02 16:48:20


[评测记录](https://www.luogu.com.cn/record/33284995) 这份代码样例没过,然而AC了 ```cpp #include<bits/stdc++.h> using namespace std; const int SIZE = 100000 + 5, INF = 0x7fffffff; inline int read() { int x = 0, f = 1; char ch = getchar(); while(ch < '0' || ch > '9') { if(ch == '-') f = -1; ch = getchar(); } while(ch >= '0' && ch <= '9') {x = x * 10 + ch - '0'; ch = getchar(); } return x * f; } struct Treap { int l, r; int val, dat; int cnt, size; }; Treap a[SIZE]; int tot, root, n; int New(int val) { tot++; a[tot].val = val; a[tot].dat = rand(); a[tot].cnt = a[tot].size = 1; return tot; } void update(int p) { a[p].size = a[a[p].l].size + a[a[p].r].size + a[p].cnt; } void build() { New(-INF); New(INF); root = 1; a[1].r = 2; update(root); } int getrank(int p, int val) { if(p == 0) return 0; if(val == a[p].val) return a[a[p].l].size + 1; if(val < a[p].val) return getrank(a[p].l, val); return getrank(a[p].r, val) + a[a[p].l].size + a[p].cnt; } int getval(int p, int rank) { if(p == 0) return INF; if(a[a[p].l].size >= rank) return getval(a[p].l, rank); if(a[a[p].l].size + a[p].cnt >= rank) return a[p].val; return getval(a[p].r, rank - a[a[p].l].size - a[p].cnt); } void zig(int &p) { int q = a[p].l; a[p].l = a[q].r; a[q].r = p; p = q; update(a[p].r); update(p); } void zag(int &p) { int q = a[p].r; a[p].r = a[q].l; a[q].l = p; p = q; update(a[p].l); update(p); } void insert(int &p, int val) { if(p == 0) { p = New(val); return; } if(val == a[p].val) { a[p].cnt++; update(p); return; } if(val < a[p].val) { insert(a[p].l, val); if(a[p].dat < a[a[p].l].dat) zig(p); } else { insert(a[p].r, val); if(a[p].dat < a[a[p].r].dat) zag(p); } update(p); } int getpre(int val) { int ans = 1; int p = root; while(p) { if(val == a[p].val) { if(a[p].l > 0) { p = a[p].l; while(a[p].r > 0) p = a[p].r; ans = p; } break; } if(a[p].val < val && a[p].val > a[ans].val) ans = p; p = val < a[p].val ? a[p].l : a[p].r; } return a[ans].val; } int getnext(int val) { int ans = 2; int p = root; while(p) { if(val == a[p].val) { if(a[p].r > 0) { p = a[p].r; while(a[p].l > 0) p = a[p].l; ans = p; } break; } if(a[p].val > val && a[p].val < a[ans].val) ans = p; p = val < a[p].val ? a[p].l : a[p].r; } return a[ans].val; } void remove(int &p, int val) { if(p == 0) return; if(val == a[p].val) { if(a[p].cnt > 1) { a[p].cnt--; update(p); return; } if(a[p].l || a[p].r) { if(a[p].r == 0 || a[a[p].l].dat > a[a[p].r].dat) { zig(p); remove(a[p].r, val); } else { zag(p); remove(a[p].l, val); } update(p); } else p = 0; return; } val < a[p].val ? remove(a[p].l, val) : remove(a[p].r, val); update(p); } int main() { n = read(); build(); while(n--) { int opt, x; opt = read(); x = read(); if(opt == 1) printf("%d\n", getrank(root, x)); else if(opt == 2) printf("%d\n", getval(root, x+1)); else if(opt == 3) printf("%d\n", getpre(x)); else if(opt == 4) printf("%d\n", getnext(x)); else if(opt == 5) insert(root, x); } return 0; } ```
by LJC00175 @ 2020-05-02 16:48:38


@[LJC00175](/user/91819) <https://www.luogu.com.cn/discuss/show/220714?page=2>
by andyli @ 2020-05-02 16:48:38


所以就是数据有误?
by LJC00175 @ 2020-05-02 16:49:02


|