本題依然是一道資料結構題,對本題而言,依然可以用splay來解。
本題的乙個難點(對於我這個弱菜而言)是如何動態的改變平衡樹中的值。其實我們可以借鑑線段樹中的lazy tag的思想,因為若要變動則是整棵樹一起變,所以我們可以開設乙個全域性變數delta表示此時對整棵樹的改變值,這樣一來,在每次插入節點x時,我們把x-delta插入平衡樹中(想想這是為什麼,不難),然後檢查時若此時的節點y滿足y+delta最後就是要注意細節,首先在插入時可能一開始工資就低於min,此時是不需要把他算入離開公司員工數的。還有就是刪除時,要找到真正的第乙個y+delta
program chashier;
const
maxn=100000;
type
date=record
ch:array[0..1]of longint;
v,f,sz:longint;
end;
var n,min,i,top,sum,root,delta,tst,x:longint;c:char;
st:array[1..maxn]of longint;
t:array[0..maxn+10]of date;
procedure newnode(var x:longint;f,k:longint);
begin
if(tst<>0)then begin x:=st[tst];dec(tst) end
else begin inc(top);x:=top; end;
t[x].ch[0]:=0;t[x].ch[1]:=0;t[x].v:=k;t[x].f:=f;t[x].sz:=1;
end;
function cmp(x,k:longint):longint;
begin
if(t[x].ch[0]=k)then exit(0) else exit(1);
end;
procedure pushup(k:longint);
begin
t[k].sz:=1+t[t[k].ch[1]].sz+t[t[k].ch[0]].sz;
end;
procedure rotate(k,c:longint);
var i:longint;
begin
i:=t[k].f;
t[i].ch[c xor 1]:=t[k].ch[c];t[t[k].ch[c]].f:=i;t[k].ch[c]:=i;
t[k].f:=t[i].f;
if(t[i].f<>0)then t[t[i].f].ch[cmp(t[i].f,i)]:=k;
t[i].f:=k;
pushup(i);
end;
procedure splay(k,goal:longint);
var x,y,f1,f2:longint;
begin
while(t[k].f<>goal)do
begin
x:=t[k].f;y:=t[x].f;
if(y=goal)then rotate(k,cmp(x,k)xor 1)
else begin
f1:=cmp(y,x);f2:=cmp(x,k);
if(f1=f2)then begin rotate(x,f1 xor 1);rotate(k,f1 xor 1) end
else begin rotate(k,f2 xor 1);rotate(k,f1 xor 1) end;
end;
end;
pushup(k);
if(goal=0)then root:=k;
end;
procedure insert(k:longint);
var i,j,x:longint;
begin
if(root=0)then
begin
newnode(root,0,k);exit;
end;
j:=0;i:=root;
repeat
j:=i;
if(kk)do
begin
if(k0)then
begin
splay(x,0);
if(t[x].ch[1]=0)then
begin
delta:=0;root:=0;del(x);
endelse begin
root:=t[root].ch[1];t[root].f:=0;t[x].ch[1]:=0;
del(x);
end;
end;
end;
procedure init;
begin
sum:=0;delta:=0;tst:=0;top:=0;root:=0;
end;
begin
readln(n,min);
init;
for i:=1 to n do
begin
readln(c,x);
if(c='s')and(root<>0)then begin delta:=delta-x;update; end;
if(c='a')and(root<>0)then delta:=delta+x;
if(c='i')and(x>=min)then insert(x-delta);
if(c='f')then
begin
if(t[root].sz
BZOJ1503 NOI2004 鬱悶的出納員
分析 一段裸的splay,支援upper bound,lower bound,然後和線段樹一樣lazy tag一下 寫得太醜qaq 注 如果加入的員工由於工資小於最低工資立刻離開了公司,此人不計入被炒員工總數 於是本題為我的ac率做出了巨大的貢獻 也可以不lazy tag,這題可以在外面開乙個tag...
bzoj1503 NOI2004 鬱悶的出納員
oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...
BZOJ1503 NOI2004 鬱悶的出納員
題目鏈結 全部修改代價太大,就記錄每個員工工資變化量delta,新加入時當前員工的工資若 min,就加入新點,值為工資x delta。立刻離開的都不算入最後的答案,坑爸爸!include include include include include include include include ...