bzoj1503 NOI2004 鬱悶的出納員

2021-06-14 22:34:52 字數 2700 閱讀 1471

本題依然是一道資料結構題,對本題而言,依然可以用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 ...