oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量。我真不知道除了調工資他還做什麼其它事情。
工資的頻繁調整很讓員工反感,尤其是集體扣除工資的時候,一旦某位員工發現自己的工資已經低於了合同規定的工資下界,他就會立刻氣憤地離開公司,並且再也不會回來了。每位員工的工資下界都是統一規定的。每當乙個人離開公司,我就要從電腦中把他的工資檔案刪去,同樣,每當公司招聘了一位新員工,我就得為他新建乙個工資檔案。
老闆經常到我這邊來詢問工資情況,他並不問具體某位員工的工資情況,而是問現在工資第k多的員工拿多少工資。每當這時,我就不得不對數萬個員工進行一次漫長的排序,然後告訴他答案。好了,現在你已經對我的工作了解不少了。正如你猜的那樣,我想請你編乙個工資統計程式。怎麼樣,不是很困難吧?
ps:最後還要求出踢出員工的數量首先這題要求數列第k大的數,涉及到插入、刪除和修改,
修改是對於整個數列,顯然不能乙個乙個改,記錄乙個類似lazy_tag的標記即可
插入的時候將num減去tag再插入
全體增加直接累加tag就行,但全體減少的話可能會踢人,進行刪除操作判斷
在刪除的時候統計刪除節點數目
tips:插入對於s(u)的維護,需要考慮到父節點們,被坑了好久
#include #include #define n 100010
#define lc(x) t[(x)][0]
using namespace std;
int n,m,rt,tot,t[n][2],k[n],fa[n],s[n],tag,num;
void rotate(int p)
s[p]=s[q];
s[q]=s[t[q][0]]+s[t[q][1]]+1;
}void splay(int x)
void insert(int v)
int x=rt,y;
while(1)
}int find(int x)
else if(ch=='f')
} printf("%d\n",num);
return 0;
}
bzoj1503 鬱悶的出納員
oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的 工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好 就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的...
BZOJ1503 鬱悶的出納員
出納員是乙個優秀的職業。根據題意要構造一種資料結構使得能動態維護乙個權值大於等於min的集合,並且支援查詢排名等操作,資料範圍來看複雜度是nlogn 由以上得出結論使用平衡樹 我用的是treap,如果刪的話就要把整顆左子樹和根節點一起刪再處理右子樹的,其他操作和普通平衡樹一樣,可以看我之前那個模板。...
鬱悶的出納員(bzoj 1503)
oier公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...