您的位置:首页 > 其它

[NOI2004]郁闷的出纳员

2014-04-28 22:27 330 查看
SBT第一题。

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
using namespace std;
#define N 200005
typedef long long LL;
struct SBT{
int lson, rson, sz, key;
void Init(){
lson = rson = key = 0;
sz = 1;
}
}s
;
int root, tot;
void LR(int &x){
int k = s[x].rson;
s[x].rson = s[k].lson;
s[k].lson = x;
s[k].sz = s[x].sz;
s[x].sz = s[s[x].lson].sz + s[s[x].rson].sz + 1;
x = k;
}
void RR(int &x){
int k = s[x].lson;
s[x].lson = s[k].rson;
s[k].rson = x;
s[k].sz = s[x].sz;
s[x].sz = s[s[x].lson].sz + s[s[x].rson].sz + 1;
x = k;
}
void Maintain(int &r, bool flag){
if(flag){
if(s[s[s[r].rson].rson].sz > s[s[r].lson].sz){
LR(r);
}
else if(s[s[s[r].rson].lson].sz > s[s[r].rson].sz){
RR(s[r].rson);
LR(r);
}
else return ;
}
else {
if(s[s[s[r].lson].lson].sz > s[s[r].rson].sz){
RR(r);
}
else if(s[s[s[r].lson].rson].sz > s[s[r].rson].sz){
LR(s[r].lson);
RR(r);
}
else return ;
}
Maintain(s[r].lson, false);
Maintain(s[r].rson, true);
Maintain(r, false);
Maintain(r, true);
}
void Insert(int &r, int k){
if(r == 0){
r = ++tot;
s[r].Init();
s[r].key = k;
}
else {
s[r].sz++;
if(k < s[r].key)
Insert(s[r].lson, k);
else
Insert(s[r].rson, k);
Maintain(r, k >= s[r].key);
}
}
int Remove(int &r, int k){
int d_key;
if(!r)return 0;
s[r].sz--;
if(s[r].key == k || (s[r].lson == 0 && k < s[r].key) || (s[r].rson == 0 && k > s[r].key)){
d_key = s[r].key;
if(s[r].lson && s[r].rson)
s[r].key = Remove(s[r].lson, k + 1);
else
r = s[r].lson + s[r].rson;
}
else Remove(k < s[r].key ? s[r].lson : s[r].rson, k);

}
void Delete(int &r, int delay, int min_val){
if(!r)return ;
if(s[r].key + delay < min_val){
r = s[r].rson;
Delete(r, delay, min_val);
}
else {
Delete(s[r].lson, delay, min_val);
s[r].sz = s[s[r].rson].sz + s[s[r].lson].sz + 1;
}
}
int Gmax(int &r){
while(s[r].rson)
r = s[r].rson;
return r;
}
int Gmin(int &r){
while(s[r].lson)
r = s[r].lson;
return r;
}
int Gpre(int &r, int y, int k){
if(r == 0)return y;
if(k > s[r].key)
Gpre(s[r].rson, r, k);
else
Gpre(s[r].lson, y, k);
}
int Gnext(int &r, int y, int k){
if(r == 0)return y;
if(k < s[r].key)
Gnext(s[r].lson, r, k);
else
Gnext(s[r].rson, y, k);
}
int Gmax_kth(int &r, int k){//不可有重复数
int t = s[s[r].rson].sz + 1;
if(t == k)return s[r].key;
if(t < k)return Gmax_kth(s[r].lson, k - t);
else return Gmax_kth(s[r].rson, k);
}
int Grank(int &r, int k){
if(k < s[r].key)
return Grank(s[r].lson, k);
else if(k > s[r].key)
return Grank(s[r].rson, k) + s[s[r].lson].sz + 1;
else
return s[s[r].lson].sz + 1;
}
void Sort(int &r){
if(r == 0)return ;
Sort(s[r].lson);
printf("%d\n", s[r].key);
Sort(s[r].rson);
}
int main(){
int q, delay, mv;
while(scanf("%d%d", &q, &mv) != EOF){
tot = delay = root = 0;
while(q--){
char str[10];
int k;
scanf("%s%d", str, &k);
if(str[0] == 'I'){
if(k < mv)continue;
Insert(root, k - delay);
}
else if(str[0] == 'A')
delay += k;
else if(str[0] == 'F')
printf("%d\n", s[root].sz < k ? -1 : (Gmax_kth(root, k) + delay));
else {
delay -= k;
Delete(root, delay, mv);
}
}
printf("%d\n", tot - s[root].sz);
}
return 0;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: