[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; }
相关文章推荐
- 【NOI】2004 郁闷的出纳员
- [题解]bzoj1503(NOI2004)郁闷的出纳员
- bzoj 1503 [NOI2004]郁闷的出纳员 splay
- BZOJ 1503: [NOI2004]郁闷的出纳员
- [NOI2004]郁闷的出纳员
- 【BZOJ】【1503】 【NOI2004】郁闷的出纳员
- [BZOJ1503][NOI2004]郁闷的出纳员(平衡树splay)
- NOI2004 郁闷的出纳员
- bzoj 1503: [NOI2004]郁闷的出纳员 splay
- 【NOI2004T1】郁闷的出纳员-平衡树入门题
- 1503: [NOI2004]郁闷的出纳员
- BZOJ 1503 [NOI2004]郁闷的出纳员 (Splaytree)
- [BZOJ1503][NOI2004]郁闷的出纳员 无旋Treap
- BZOJ 1503 [NOI 2004] 郁闷的出纳员 (splay)
- BZOJ1503【NOI2004】郁闷的出纳员
- bzoj1503 [NOI2004]郁闷的出纳员(名次树+懒惰标记)
- [BZOJ1503] [NOI2004]郁闷的出纳员
- 【HYSBZ 1503: [NOI2004]】郁闷的出纳员——伸展树
- NOI2004 郁闷的出纳员
- Bzoj1503--Noi2004郁闷的出纳员