BZOJ1503 NOI2004 鬱悶的出納員

2021-08-28 17:10:36 字數 2365 閱讀 1353

time limit: 5 sec  memory limit: 64 mb

submit: 13722  solved: 4988

oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的

工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好

,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量。我

真不知道除了調工資他還做什麼其它事情。工資的頻繁調整很讓員工反感,尤其是集體扣除工資的時候,一旦某位

員工發現自己的工資已經低於了合同規定的工資下界,他就會立刻氣憤地離開公司,並且再也不會回來了。每位員

工的工資下界都是統一規定的。每當乙個人離開公司,我就要從電腦中把他的工資檔案刪去,同樣,每當公司招聘

了一位新員工,我就得為他新建乙個工資檔案。老闆經常到我這邊來詢問工資情況,他並不問具體某位員工的工資

情況,而是問現在工資第k多的員工拿多少工資。每當這時,我就不得不對數萬個員工進行一次漫長的排序,然後

告訴他答案。好了,現在你已經對我的工作了解不少了。正如你猜的那樣,我想請你編乙個工資統計程式。怎麼樣

,不是很困難吧?

第一行有兩個非負整數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是乙個正整數。

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

i命令的條數不超過100000 

a命令和s命令的總條數不超過100 

f命令的條數不超過100000 

每次工資調整的調整量不超過1000 

新員工的工資不超過100000

輸出行數為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解析:

splay,treap均可。

每次對工資進行改動時顯然不能將所有人的工資進行加減,所以用乙個add變數記錄增量,每次插入(num-add)。這樣就能保證樹中所有數加上add就是真正的值,方便處理。另外還要注意如果當前加進來的數本來就小於最低限度就不用加進樹中。

**(旋轉treap):

#include using namespace std;

const int inf=1e9+7;

const int max=100005;

int n,m,tot,root,sum,ans,add,x;

struct shu;

shu a[max];

char ch[2];

inline int get_int()

inline void print(int x)

inline int new(int x)

inline void update(int p)

inline void zig(int &p)

inline void zag(int &p)

inline void insert(int &p,int x)

if(a[p].num==x)

if(xa[p].data) zig(p);

}else

update(p);}

inline int pre(int p,int x)

inline void remove(int &p,int x)

if(a[p].l||a[p].r)

else p=0;

return;

}if(x=x) return val(a[p].r,x);

if(a[a[p].r].size+a[p].cnt>=x) return a[p].num;

return val(a[p].l,x-a[a[p].r].size-a[p].cnt);}

int main()

print(sum);

return 0;

}

bzoj1503 NOI2004 鬱悶的出納員

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

BZOJ1503 NOI2004 鬱悶的出納員

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

bzoj1503 NOI2004 鬱悶的出納員

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