模板题
bzoj3224: Tyvj 1728 普通平衡树
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define pb push_back
#define mp make_pair
#define xx first
#define yy second
using namespace std;
typedef long long i64;
typedef pair<int, int> pii;
const int inf = ~0U >> ;
const i64 INF = ~0ULL >> ;
//***************************** const int maxn = ;
struct node {
int l, r, v, w, sz, rnd;
node () { l = r = v = w = sz = rnd = ; }
} tr[maxn];
int ndtot, root, ans; int read() {
int l = , s(); char ch = getchar_unlocked();
while (ch < '' || ch > '') { if (ch == '-') l = -; ch = getchar_unlocked(); }
while (ch >= '' && ch <= '') { s = (s << ) + (s << ) + ch - ''; ch = getchar_unlocked(); }
return l * s;
} void update(int &k) { tr[k].sz = tr[tr[k].l].sz + tr[k].w + tr[tr[k].r].sz; } void lturn(int &k) {
int t = tr[k].r; tr[k].r = tr[t].l; tr[t].l = k;
tr[t].sz = tr[k].sz; update(k); k = t;
} void rturn(int &k) {
int t = tr[k].l; tr[k].l = tr[t].r; tr[t].r = k;
tr[t].sz = tr[k].sz; update(k); k = t;
} void insrt(int &k, int x) {
if (k == ) {
k = ++ndtot;
tr[k].sz = tr[k].w = , tr[k].v = x, tr[k].rnd = rand();
return;
}
tr[k].sz++;
if (tr[k].v == x) tr[k].w++;
else if (x > tr[k].v) {
insrt(tr[k].r, x);
if (tr[tr[k].r].rnd < tr[k].rnd) lturn(k);
}
else {
insrt(tr[k].l, x);
if (tr[tr[k].l].rnd < tr[k].rnd) rturn(k);
}
} void del(int &k, int x) {
if (k == ) return;
if (tr[k].v == x) {
if (tr[k].w > ) {
tr[k].w--; tr[k].sz--; return;
}
if (tr[k].l * tr[k].r == ) k = tr[k].l + tr[k].r;
else if (tr[tr[k].l].rnd < tr[tr[k].r].rnd) rturn(k), del(k, x);
else lturn(k), del(k, x);
}
else if (x > tr[k].v) tr[k].sz--, del(tr[k].r, x);
else tr[k].sz--, del(tr[k].l, x);
} int query_rnk(int k, int x) {
if (k == ) return ;
if (tr[k].v == x) return tr[tr[k].l].sz + ;
else if (x > tr[k].v) return tr[tr[k].l].sz + tr[k].w + query_rnk(tr[k].r, x);
else return query_rnk(tr[k].l, x);
} int query_num(int k, int x) {
if (k == ) return ;
if (x <= tr[tr[k].l].sz) return query_num(tr[k].l, x);
else if (x > tr[tr[k].l].sz + tr[k].w) return query_num(tr[k].r, x - tr[tr[k].l].sz - tr[k].w);
else return tr[k].v;
} void query_pre(int k, int x) {
if (k == ) return;
if (x > tr[k].v) {
ans = tr[k].v; query_pre(tr[k].r, x);
}
else query_pre(tr[k].l, x);
} void query_sub(int k, int x) {
if (k == ) return;
if (x < tr[k].v) {
ans = tr[k].v; query_sub(tr[k].l, x);
}
else query_sub(tr[k].r, x);
} int main() {
int n; n = read();
while (n--) {
int op, x; op = read(), x = read();
switch(op) {
case : insrt(root, x); break;
case : del(root, x); break;
case : printf("%d\n", query_rnk(root, x)); break;
case : printf("%d\n", query_num(root, x)); break;
case : ans = ; query_pre(root, x); printf("%d\n", ans); break;
case : ans = ; query_sub(root, x); printf("%d\n", ans); break;
}
}
}
bzoj1503: 郁闷的出纳员
按理来说Treap保持平衡后是不能旋转的,然而这个题乱搞A了,把要查询的点旋转到根上然后干掉。。
#include <bits/stdc++.h>
#define rep(i, a, b) for (int i = a; i <= b; i++)
#define REP(i, a, b) for (int i = a; i < b; i++)
#define drep(i, a, b) for (int i = a; i >= b; i--)
#define mp make_pair
#define pb push_back
#define clr(x) memset(x, 0, sizeof(x))
#define xx first
#define yy second
using namespace std;
typedef long long i64;
const int inf = ~0U>>;
const i64 INF = ~0ULL>>;
//**************************** const int maxn = ; struct node {
int l, r, v, rnd, w, sz;
node() { l = r = v = rnd = w = sz = ; }
} tr[maxn];
int ndtot, root;
void update(int k) { tr[k].sz = tr[tr[k].l].sz + tr[k].w + tr[tr[k].r].sz; }
void lturn(int &k) {
int t = tr[k].r; tr[k].r = tr[t].l; tr[t].l = k;
tr[t].sz = tr[k].sz; update(k); k = t;
}
void rturn(int &k) {
int t = tr[k].l; tr[k].l = tr[t].r; tr[t].r = k;
tr[t].sz = tr[k].sz; update(k); k = t;
} void insrt(int &k, int x) {
if (!k) {
k = ++ndtot;
tr[k].v = x, tr[k].rnd = rand(), tr[k].w = tr[k].sz = ;
return;
}
tr[k].sz++;
if (tr[k].v == x) tr[k].w++;
else if (x > tr[k].v) {
insrt(tr[k].r, x);
if (tr[tr[k].r].rnd < tr[k].rnd) lturn(k);
}
else if (x < tr[k].v) {
insrt(tr[k].l, x);
if (tr[tr[k].l].rnd < tr[k].rnd) rturn(k);
}
} int query_num(int &k, int x) {
if (!k) return ;
if (x <= tr[tr[k].l].sz) return query_num(tr[k].l, x);
else if (x > tr[tr[k].l].sz + tr[k].w) return query_num(tr[k].r, x - tr[tr[k].l].sz - tr[k].w);
else return tr[k].v;
} void fix(int &k, int x) {
if (!k) return;
if (tr[k].v >= x) {
fix(tr[k].l, x);
if (tr[k].l && tr[tr[k].l].v >= x) rturn(k);
}
else {
fix(tr[k].r, x);
if (tr[k].r && tr[tr[k].r].v >= x) lturn(k);
}
} char str[];
int main() {
int n, m;
scanf("%d%d", &n, &m);
int tot();
int be();
insrt(root, 0x3f3f3f3f);
while (n--) {
int x;
scanf("%s%d", str, &x);
if (str[] == 'I') { if (x >= m) insrt(root, x - tot), be++; }
else if (str[] == 'A') tot += x;
else if (str[] == 'S') {
tot -= x;
fix(root, m - tot);
tr[root].sz -= tr[tr[root].l].sz;
tr[tr[root].l] = node();
tr[root].l = ;
}
else {
if (x + > tr[root].sz) puts("-1");
else printf("%d\n", query_num(root, tr[root].sz - x) + tot);
}
}
printf("%d\n", be - tr[root].sz + );
return ;
}