| ||||||||||
| Online Judge | Problem Set | Authors | Online Contests | User | ||||||
|---|---|---|---|---|---|---|---|---|---|---|
| Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest | |||||||||
Avl模板测试(我怎么觉得AVL比SBT好写……错觉么)#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
const int N = 1e5+10;
template<class T> struct Avl {
struct Node {
Node *son[2];
int height;
T data;
int ratio() {return (son[1]? son[1]->height: 0)-(son[0]? son[0]->height: 0);}
Node *pull() {
height = 1;
for (int i = 0; i < 2; i++)
if (son[i]) height = max(height, son[i]->height+1);
return this;
}
Node *setSon(int vane, Node *orphan) {
son[vane] = orphan;
return pull();
}
Node *spin(int vane) {
Node *x = son[!vane]->son[vane];
son[!vane]->son[vane] = this;
Node *y = son[!vane];
setSon(!vane, x);
return y->pull();
}
Node *fine() {
int x = ratio();
if (-1 <= x && x <= 1) return this;
int vane = 0 < x;
if ((0 < son[vane]->ratio()) != vane)
setSon(vane, son[vane]->spin(vane));
return spin(!vane);
}
Node *end(int vane) {return son[vane]? son[vane]->end(vane): this;}
};
Node pool[N], *root, *top;
int size;
Avl(): root(NULL), top(pool), size(0) {}
Node *make(T &data) {
Node t = {{0}, 1, data};
return &(*(top++) = t);
}
Node *addAux(Node *cur, T &data) {
if (!cur) return make(data);
int vane = cur->data < data;
return cur->setSon(vane, addAux(cur->son[vane], data))->fine();
}
void add(T &data) {
root = addAux(root, data);
size++;
}
T &findAux(Node *cur, T &data) {
if (!cur) return T();
if (cur->data == data) return cur->data;
int vane = cur->data < data;
return findAux(cur->son[vane], data);
}
T &find(T &data) {return findAux(root, data);}
Node *removeAux(Node *cur, T &data) {
if (!cur) return NULL;
int vane = cur->data < data;
if (cur->data == data) {
if (cur->son[0] == cur->son[1]) return 0;
vane = cur->son[1] != NULL;
swap(cur->data, cur->son[vane]->end(!vane)->data);
}
return cur->setSon(vane, removeAux(cur->son[vane], data))->fine();
}
void remove(T &data) {
root = removeAux(root, data);
size--;
}
T end(int vane) {return root->end(vane)->data;}
};
struct Client {
int id, p;
void input() {scanf("%d%d", &id, &p);}
friend bool operator < (const Client &lhs, const Client &rhs) {
return lhs.p < rhs.p;
}
friend bool operator == (const Client &lhs, const Client &rhs) {
return lhs.p == rhs.p;
}
};
Avl<Client> zkl;
int main() {
#ifndef ONLINE_JUDGE
freopen("input.in", "r", stdin);
#endif
int op;
while (scanf("%d", &op), op) {
if (op == 1) {
Client t;
t.input();
zkl.add(t);
} else {
if (!zkl.size) {
puts("0");
} else {
Client ret = zkl.end(op == 2);
printf("%d\n", ret.id);
zkl.remove(ret);
}
}
}
return 0;
}
Followed by:
Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator