題面
用delta記錄對工資的加減,那麼新增節點時點權應-delta,輸出時+delta
幾種操作中減少工資較麻煩:
1.delta-=val;
2.刪點
求前驅轉到根,刪除左子樹
這裡的刪除不用乙個乙個暴力刪,直接斷掉子樹關係即可
至於求k大 我比較懶直接改成求size-k+1小 (逃)
#include#include#include
using
namespace
std;
const
int n=1e5+5
;int n,fa[n],cnt[n],son[n][3
],size[n],key[n],type,root;
intline,ans,num,delta;
void clear(int
x)bool judge(int
x)void up(intx)}
void rotate(int
x)void splay(int
x)void ins(int
x)
int now=root,f=0
;
while(1
)
f=now;now=son[now][key[now]if(!now)
}}int getnum(int
x) }
}int
pre()
void del(int
x)
if(!son[root][0]&&!son[root][1
])
if(!son[root][0
])
else
if(!son[root][1
])
int old=root,l=pre();
splay(l);
son[root][
1]=son[old][1
]; fa[son[old][
1]]=root;
clear(old);
up(root);
}void
del_tree()
inline
intread()
while(ch>='
0'&&ch<='9'
)
return x*f;
}int
main()
case'a
':delta+=val;break
;
case's
':delta-=val;
ins(line-delta);
ans+=son[root][0]?size[son[root][0]]:0
; del_tree();
del(val-delta);
break
;
case'f
':if(size[root]"-1"
);
else printf("
%d\n
",getnum(size[root]-val+1)+delta);
break
; }
}cout
return0;
}
鬱悶的出納員
這題坑死我了。oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣...
bzoj1503 Splay 鬱悶的出納員
description oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的 工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好 就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把...
BZOJ 1503 鬱悶的出納員(splay)
題意 給出乙個數列 初始為空 給出乙個最小值min,當數列中的數字小於min時自動刪除。四種操作 1 數列中增加乙個元素,設定初始值x 若x小於min則不插入 2 所有的元素增加乙個值det 3 所有的元素減小乙個值det 此時有可能有一些會被刪除 4 詢問目前所有元素中第k大的。最後輸出刪除了多少...