您的位置:首页 > 其它

Treap初步

2015-12-04 12:37 309 查看
模板题

  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 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>>1;
const i64 INF = ~0ULL>>1;
//****************************

const int maxn = 100005;

struct node {
int l, r, v, rnd, w, sz;
node() { l = r = v = rnd = w = sz = 0; }
} 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 = 1;
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 0;
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[5];
int main() {
int n, m;
scanf("%d%d", &n, &m);
int tot(0);
int be(0);
insrt(root, 0x3f3f3f3f);
while (n--) {
int x;
scanf("%s%d", str, &x);
if (str[0] == 'I') { if (x >= m) insrt(root, x - tot), be++; }
else if (str[0] == 'A') tot += x;
else if (str[0] == 'S') {
tot -= x;
fix(root, m - tot);
tr[root].sz -= tr[tr[root].l].sz;
tr[tr[root].l] = node();
tr[root].l = 0;
}
else {
if (x + 1 > tr[root].sz) puts("-1");
else printf("%d\n", query_num(root, tr[root].sz - x) + tot);
}
}
printf("%d\n", be - tr[root].sz + 1);
return 0;
}


View Code
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: