[NOI2004]郁闷的出纳员
2014-07-10 17:34
393 查看
之前SBT写过一次,Splay再写一次。加上cnt记录相同工资人数。
因为少加一对括号导致TLE无数次。。。
因为少加一对括号导致TLE无数次。。。
#include <cstdio> #include <iostream> #include <algorithm> #include <cstring> using namespace std; #define N 100005 #define mod 20140518 #define inf 1 << 29; typedef long long LL; int n, mv, leanum; int pre , key , ch [2], root, tot1, sz ; int cnt ; //ch[][0]为左孩子,ch[][1]为右孩子 void NewNode(int &r, int goal, int k){ r = ++tot1; pre[r] = goal; key[r] = k; sz[r] = 1; cnt[r] = 1; ch[r][0] = ch[r][1] = 0; } void pushup(int x){ sz[x] = cnt[x]; if(ch[x][0])sz[x] += sz[ch[x][0]]; if(ch[x][1])sz[x] += sz[ch[x][1]]; } //kind = 1为右旋,kind为0左旋 void Rotate(int x,int kind){ int y = pre[x]; ch[y][!kind] = ch[x][kind]; pre[ch[x][kind]] = y; if(pre[y]){ ch[pre[y]][ch[pre[y]][1] == y] = x; }//y节点有父节点用x节点将其替代 pre[x] = pre[y]; ch[x][kind] = y; pre[y] = x; pushup(y); } void Splay(int r, int goal){ while(pre[r] != goal){ int y = pre[r]; int kind = (ch[y][0] == r); if(pre[y] != goal && (kind == (ch[pre[y]][0] == y))){ Rotate(y, kind); } Rotate(r, kind); } pushup(r); if(goal == 0)root = r; } void RotateTo(int k, int goal){//把第k大的树转到goal下面 LL r = root; while(sz[ch[r][1]] >=k || k > sz[ch[r][1]] + cnt[r]){ if(k <= sz[ch[r][1]])r = ch[r][1]; else { k -= sz[ch[r][1]] + cnt[r]; r = ch[r][0]; } } Splay(r, goal); } void Insert(int k){ int r = root; while(ch[r][key[r] < k]){ if(key[r] == k){ cnt[r]++; sz[r]++; Splay(r, 0); return; } sz[r]++; r = ch[r][key[r] < k]; } NewNode(ch[r][k > key[r]], r, k); Splay(ch[r][k > key[r]], 0); } void Delete(int r){ if(mv > key[r]){ leanum += sz[ch[r][0]] + cnt[r]; if(pre[r])ch[pre[r]][ch[pre[r]][1] == r] = ch[r][1]; else root = ch[r][1]; pre[ch[r][1]] = pre[r]; if(ch[r][1])Delete(ch[r][1]); } else if(ch[r][0])Delete(ch[r][0]); pushup(r); } int main(){ while(scanf("%d%d", &n, &mv) != EOF){ cnt[0] = 0; int add = 0; char c[9]; int x; leanum = 0; root = tot1 = 0; while(n--){ scanf("%s%d", c, &x); if(c[0] == 'I'){ if(x + add < mv)continue; if(root == 0){ NewNode(root, 0, x + add); } else Insert(x + add); } else if(c[0] == 'A'){ add -= x; mv -= x; } else if(c[0] == 'S'){ add += x; mv += x; Delete(root); } else { //printf("%d\n", sz[root]); if(sz[root] < x)printf("-1\n"); else { RotateTo(x , 0); printf("%d\n", key[root] - add); } } } printf("%d\n", leanum); } return 0; }
相关文章推荐
- 【bzoj 1503】 [NOI2004]郁闷的出纳员
- 【NOI2004】 郁闷的出纳员
- 【Treap/非旋转Treap】BZOJ1503 [NOI2004]郁闷的出纳员
- NOI2004——郁闷的出纳员(SBT)
- NOI2004 - 郁闷的出纳员
- 【NOI2004】郁闷的出纳员Codevs1286
- 【BZOJ】1503 [NOI2004]郁闷的出纳员 平衡树
- bzoj1503[NOI2004]郁闷的出纳员 treap
- bzoj 1503 [NOI2004]郁闷的出纳员 平衡树(treap/Splay)
- BZOJ1503 [NOI2004]郁闷的出纳员
- 【NOI2004】郁闷的出纳员Splay版
- 【BZOJ1503】[NOI2004]郁闷的出纳员
- BZOJ 1503: [NOI2004]郁闷的出纳员 splay
- BZOJ 1503 郁闷的出纳员(平衡树)(NOI 2004)
- 【BZOJ】1503: [NOI2004]郁闷的出纳员(Splay)
- [NOI2004] 郁闷的出纳员 - 平衡树
- NOI2004 郁闷的出纳员
- 【NOI2004】郁闷的出纳员 平衡树
- [NOI2004]郁闷的出纳员(Treap)
- bzoj 1503: [NOI2004]郁闷的出纳员