NOI 2004 鬱悶的出納員

2022-02-27 12:11:01 字數 3384 閱讀 1982

oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量。我真不知道除了調工資他還做什麼其它事情。工資的頻繁調整很讓員工反感,尤其是集體扣除工資的時候,一旦某位員工發現自己的工資已經低於了合同規定的工資下界,他就會立刻氣憤地離開公司,並且再也不會回來了。每位員工的工資下界都是統一規定的。每當乙個人離開公司,我就要從電腦中把他的工資檔案刪去,同樣,每當公司招聘了一位新員工,我就得為他新建乙個工資檔案。老闆經常到我這邊來詢問工資情況,他並不問具體某位員工的工資情況,而是問現在工資第k多的員工拿多少工資。每當這時,我就不得不對數萬個員工進行一次漫長的排序,然後告訴他答案。好了,現在你已經對我的工作了解不少了。正如你猜的那樣,我想請你編乙個工資統計程式。怎麼樣,不是很困難吧?

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

9 10

i 60

i 70

s 50

f 2i 30

s 15

a 5f 1

f 210

20-1

2平衡樹直接扔

sbt:

#include#include

using

namespace

std;

struct

na};

int root=0,num=0,ans=0

;long

n,m,k;

na t[

100001

];inline

void rir(int &p)

inline

void ler(int &p)

void ph(int &p,bool

bo)else

return

; }

else

else

return

; }

ph(t[p].l,0);

ph(t[p].r,1);

ph(p,0);

ph(p,1);

}void insert(int &p,int

key)

else

ph(p,t[p].k

<=key);

}void del(int &p,int

key)

if (t[p].k

else

ph(p,1);

ph(p,0);

}int que(int p,int

key)

intmain()

if (c[0]=='a'

)

if (c[0]=='s'

)

if (c[0]=='f'

) }

printf("%d

",ans);

return0;

}

splay:

#include#include

using

namespace

std;

struct

na};

int root=0,num=0,ans=0

,p,qq;

long

n,m,k;

na t[

100001

];char

ch;inline

intread()

inline

bool getc(int

x)inline

void lturn(int &p)

inline

void rturn(int &p)

inline

void ph(int &x,bool

bo)inline

void splay(int

l)

int p=t[t[l].f].f;

if (getc(l)==getc(t[l].f))

else

}else

else}}

}inline

void insert(int &p,int k,int

f)else

}inline

void del(int &p,int

key)

if (t[p].k

else

if (p!=0) t[p].s=t[t[p].l].s+t[t[p].r].s+1;}

inline

int que(int p,int

key)

intmain()

else

if (c[0]=='a'

)else

if (c[0]=='s'

)else

if (c[0]=='f'

) }

printf("%d

",ans);

return0;

}

treap:

#include#include

#include

using

namespace

std;

struct

na};

int root=0,num=0,ans=0

;long

n,m,k;

na t[

100001

];inline

void rir(int &p)

inline

void ler(int &p)

inline

void insert(int &p,int

key)

else

else

}}inline

void del(int &p,int

key)

if (t[p].k

else

}inline

int que(int p,int

key)

intmain()

if (c[0]=='a'

)

if (c[0]=='s'

)

if (c[0]=='f'

) }

printf("%d

",ans);

return0;

}

noi 2004 鬱悶的出納員

原題位址 花了一兩天真正的熟悉了treap,對於乙個東西,本蒟蒻認為,不應該要會,還應會熟練的寫,像哈狗寫這個只需十分鐘 好吧,話歸正題 先推薦另類解法 戳進去 此題解法很多bit 權值線段樹 各種平衡樹 準備抽空寫 是一道很棒的模板題。這道題我們把每次全體加的工資和減的弄到乙個變數,姑且叫為w,把...

NOI2004 鬱悶的出納員

大致題意就是對初始為空的數列的各種操作233 題解 splay啦 其中可能會遇到的幾個問題 1.如何刪去低於min的點 找到數列中min的後繼提為根,把根的左孩子丟 shan 了就完成了 很容易yy到的對吧 2.如何處理對當前數列中的數進行 k 開個全域性變數存整體的波動 值ff。那麼刪點的時候就把...

NOI2004 鬱悶的出納員

點此看題 這道題很新的一點就是加工資和減工資,這貌似要用到區間修改。但是細細想想,操作的物件是全樹,我們可以維護乙個累積的修改值,新加入乙個點的話要刪去之前的累計的修改值,對於減工資的情況,判斷有沒有低於最低的限制。注意如果乙個一來人就低於最低線,那麼這個人不被統計在最後的刪除人數中。include...