**\(splay\):
**\(fhq\)_\(treap\):
題目傳送門:
對於每個人都加工資,我們可以直接降低最低工資標準來判斷,對於減工資,我們就加標準,那麼每個人與最低標準的差值始終是正確的。
我們記乙個\(now\)表示當前最低工資標準,記乙個\(mn\)表示初始工資標準。那麼每次進來乙個工資為\(k\)的人,我們要使他與最低工資標準的差值是正確的,就應該使\(k\)加上\(now-mn\)。
而每個人與當前最低標準的差值加上初始標準,就是真實工資。
時間複雜度:\(o(nlogn)\)
空間複雜度:\(o(n)\)
#include #include using namespace std;
const int maxn=1e5+5;
char s[25];
int n,mn,now,tot;
int read()
struct splay
int find(int v)
if(val[u]val[u]]=tot;
splay(tot);
}void check()
struct fhq_treap
int getkth(int u,int v,bool &bo,int delta)
else ans=siz[son[u][0]]+cnt[u]+getkth(son[u][1],v,bo,delta);
if(bo)siz[u]+=delta;return ans;
}void update(int p)
pii split(int u,int rk)
else
}int merge(int a,int b)
void ins(int v)
void check()
int get_val(int k)
return val[u]+mn-now;
}}t;
int main()
if(s[1]=='a')now-=k;
if(s[1]=='s')
if(s[1]=='f')printf("%d\n",t.get_val(k));
}printf("%d\n",tot-t.siz[t.root]);
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公司是一家大型專業化軟體公司,有著數以萬計的員工。作為一名出納員,我的任務之一便是統計每位員工的工資。這本來是乙份不錯的工作,但是令人鬱悶的是,我們的老闆反覆無常,經常調整員工的工資。如果他心情好,就可能把每位員工的工資加上乙個相同的量。反之,如果心情不好,就可能把他們的工資扣除乙個相同的量...