bzoj 3224 NOI2004鬱悶的出納員

2022-05-18 08:51:15 字數 1879 閱讀 3959

2023年12月26日6,1818

第一行有兩個非負整數n和min。n表示下面有多少條命令,min表示工資下界。

接下來的n行,每行表示一條命令。命令可以是以下四種之一:

名稱格式

作用i命令

i_k新建乙個工資檔案,初始工資為k。如果某員工的初始工資低於工資下界,他將立刻離開公司。

a命令a_k

把每位員工的工資加上k

s命令s_k

把每位員工的工資扣除k

f命令f_k

查詢第k多的工資

_(下劃線)表示乙個空格,i命令、a命令、s命令中的k是乙個非負整數,f命令中的k是乙個正整數。

在初始時,可以認為公司裡乙個員工也沒有。

輸出檔案的行數為f命令的條數加一。

對於每條f命令,你的程式要輸出一行,僅包含乙個整數,為當前工資第k多的員工所拿的工資數,如果k大於目前員工的數目,則輸出-1。

輸出檔案的最後一行包含乙個整數,為離開公司的員工的總數。

9 10

i 60

i 70

s 50

f 2i 30

s 15

a 5f 1

f 2

-1

題解:模板題吧,就是記錄乙個變化量搞一搞,裸的treap,記錄重複**搞錯了,調了乙個小時,無語了。

1 #include2 #include3 #include4 #include5 #include6

7#define ls tr[p].l

8#define rs tr[p].r

9#define n 100007

10using

namespace

std;

11 inline int

read()

1215

while(ch>='

0'&&ch<='9')

16return x*f;17}

1819

intn,m,sz,rt,ans,bh;

20char flag[3

];21

struct

node

22tr[n];//

最多多少個節點,就開多少空間

2526 inline int

rand()

30 inline void update(int

p)31

34void lturn(int &p)

3539

void rturn(int &p)

4044

void ins(int &p,int

x)45

52 tr[p].siz++;

53if (tr[p].val==x) tr[p].ct++;

54else

if (x>tr[p].val)

55else

5963}64

int del(int &p,int

x)65

72else

7377}78

int find_sz(int p,int

x)79

87int

main()

88100

if (flag[0]=='

f') printf("

%d\n

",(x>tr[rt].siz)?-1:find_sz(rt,tr[rt].siz-x+1

));101

}102 printf("%d"

,ans);

103 }

bzoj1503 NOI2004 鬱悶的出納員

本題依然是一道資料結構題,對本題而言,依然可以用splay來解。本題的乙個難點 對於我這個弱菜而言 是如何動態的改變平衡樹中的值。其實我們可以借鑑線段樹中的lazy tag的思想,因為若要變動則是整棵樹一起變,所以我們可以開設乙個全域性變數delta表示此時對整棵樹的改變值,這樣一來,在每次插入節點...

BZOJ1503 NOI2004 鬱悶的出納員

分析 一段裸的splay,支援upper bound,lower bound,然後和線段樹一樣lazy tag一下 寫得太醜qaq 注 如果加入的員工由於工資小於最低工資立刻離開了公司,此人不計入被炒員工總數 於是本題為我的ac率做出了巨大的貢獻 也可以不lazy tag,這題可以在外面開乙個tag...

bzoj1503 NOI2004 鬱悶的出納員

oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...