刚刚过了平衡树的板子,来拿双倍经验,发现T了!!! 然后写了一个普通二叉搜索树的板子,又T了!!! 现在附上代码(
#include <bits/stdc++.h>
using namespace std;
void read(int& x)
{
x = 0;
int f = 1;
char ch = getchar();
while (ch < 48 || ch > 57)
{
if (ch == 45) f = -1;
ch = getchar();
}
while (ch >= 48 && ch <= 57)
{
x = (x << 3) + (x << 1) + (ch ^ 48);
ch = getchar();
}
x = x * f;
}
void write(int x)
{
if (x < 0)
{
putchar(45);
x = -x;
}
if (x > 9) write(x / 10);
putchar(x % 10 + 48);
}
//////////////////////////////////////////////////
int lc[10001];
int rc[10001];
int val[10001];
int size[10001];
int cnt[10001];
int num;
int root;
void insert(int& o, int v)
{
if (!o)
{
o = ++num;
val[o] = v;
size[o] = 1;
cnt[o] = 1;
return;
}
++size[o];
if (val[o] == v)
{
++cnt[o];
return;
}
if (v > val[o]) insert(rc[o], v);
else if (v < val[o]) insert(lc[o], v);
}//insert
int deletmin(int&o)
{
if (!lc[o])
{
int u = o;
o = rc[o];
return u;
}
else
{
int u = deletmin(lc[o]);
size[o] -= cnt[u];
return u;
}
}
void delet(int& o, int v)
{
--size[o];
if (val[o] == v)
{
if (cnt[o] > 1)
{
--cnt[o];
return;
}
if (lc[o] && rc[o]) o = deletmin(rc[o]);
else o = rc[o] + lc[o];
return;
}
if (v > val[o]) delet(rc[o], v);
else if (v < val[o]) delet(lc[o], v);
}
int query_rank(int o, int v)
{
if (val[o] == v) return size[lc[o]] + 1;
if (val[o] > v) return query_rank(lc[o], v);
if (val[o] < v) return size[lc[o]] + cnt[o] + query_rank(rc[o], v);
}//rank
int query_element(int o, int k)
{
if (size[lc[o]] >= k) return query_element(lc[o], k);
if (size[lc[o]] + cnt[o] < k) return query_element(rc[o], k - size[lc[o]] - cnt[o]);
return val[o];
}//element
inline int query_front(int v)
{
int rt = -2147483647;
int o = root;
while (o)
{
if (val[o] >= v) o = lc[o];
else
{
rt = max(rt, val[o]);
o = rc[o];
}
}
return rt;
}//front
inline int query_back(int v)
{
int rt = 2147483647;
int o = root;
while (o)
{
if (val[o] <= v) o = rc[o];
else
{
rt = min(rt, val[o]);
o = lc[o];
}
}
return rt;
}//back
int n;
signed main(void)
{
srand((int)time(NULL));
read(n);
while (n--)
{
int op, x;
read(op); read(x);
switch (op)
{
case 1: printf("%d\n", query_rank(root, x)); break;
case 2: printf("%d\n", query_element(root, x)); break;
case 3: printf("%d\n", query_front(x)); break;
case 4: printf("%d\n", query_back(x)); break;
case 5: insert(root, x); break;
}
}
return 0;
}