鬱悶的出納員 題解(Splay)

2022-03-16 16:57:40 字數 1709 閱讀 9583

題面

用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大的。最後輸出刪除了多少...