oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量。我真不知道除了調工資他還做什麼其它事情。工資的頻繁調整很讓員工反感,尤其是集體扣除工資的時候,一旦某位員工發現自己的工資已經低於了合同規定的工資下界,他就會立刻氣憤地離開公司,並且再也不會回來了。每位員工的工資下界都是統一規定的。每當乙個人離開公司,我就要從電腦中把他的工資檔案刪去,同樣,每當公司招聘了一位新員工,我就得為他新建乙個工資檔案。老闆經常到我這邊來詢問工資情況,他並不問具體某位員工的工資情況,而是問現在工資第k多的員工拿多少工資。每當這時,我就不得不對數萬個員工進行一次漫長的排序,然後告訴他答案。好了,現在你已經對我的工作了解不少了。正如你猜的那樣,我想請你編乙個工資統計程式。怎麼樣,不是很困難吧?
第一行有兩個非負整數n和min。n表示下面有多少條命令,min表示工資下界。接下來的n行,每行表示一條命令。命令可以是以下四種之一:
名稱格式
功能 i命令
i_k新建乙個工資檔案,初始工資為k。如果某員工的
初始工資低於工資下界,他將立刻離開公司
a命令a_k把每位員工的工資加上k
s命令s_k把每位員工的工資扣除k
f命令f_k查詢第k多的工資
輸出檔案的行數為f命令的條數加一。對於每條f命令,你的程式要輸出一行,僅包含乙個整數,為當前工資第k多的員工所拿的工資數,如果k大於目前員工的數目,則輸出-1。輸出檔案的最後一行包含乙個整數,為離開公司的員工的總數。
9 10
i 60
i 70
s 50
f 2i 30
s 15
a 5f 1
f 2
10
20-1
2
noi2004
平衡樹的裸題,但是很多小的技巧和思路還是讓它成為了一道非常經典的題目
del()函式的寫法很巧妙,刪除從開頭開始的連續一段區間
維護乙個變數表示對全域性的修改,但是要注意的是插入,刪除以及輸出的時候都要考慮這個變數的影響
個人認為平衡樹的函式裡面,如果涉及到x與t[k].v的比較的話,一般把要操作的量放在前面不容易出錯,如插入、查詢前驅後繼,或者是單點刪除。而本題del()函式裡在判斷時寫法是t[k].v<=x,這是因為實際上要操作的量是t[k].v,這裡的x相當於只是乙個刪除的參考值而已。
注重細節,題目問的是第k大,可以直接寫左》根》右的平衡樹或者轉化為第幾小即可。
#include#include#include#include#include#include#include#define fa(i,s,t) for(int i=(s);i<=(t);i++)
#define fd(i,s,t) for(int i=(s);i>=(t);i--)
#define pri pair#define lld long long
using namespace std;
int getint()
while(ch>='0'&&ch<='9')
return x*f;
}const int inf=(int) 2e9;
const int maxn=100000+50;
struct tnode
t[maxn];
int cnt=0;
#define ls (t[k].l)
#define rs (t[k].r)
inline void pushup(int k)
inline void rturn(int &k)
inline void lturn(int &k)
void ins(int &k,int x)
t[k].s++;
if(x==t[k].v)
else if(x=x)
else if(tp>=x)
return kth(rs,x-tp-t[k].w);
}int n,m,root=0,e=0,ans=0;
int main()
else if(op_c=='a')
else if(op_c=='s')
else
}printf("%d\n",ans);
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公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...