題目描述:
為了維持農場的運轉,約翰必須打工賺錢。他接到了 n 份工作,每份工作恰好占用他一天的時間。約翰從第一天開始工作,他可以任意安排這些工作的順序,第 i 份工作有 pi 的報酬,但必須在第 di 天結束之前完成。在截止日期後完成的工作沒有報酬。請幫助約翰規劃每天的工作,使得他賺到的錢最多。
1 ≤ n ≤ 105 , 1 ≤ di ,pi ≤ 109 這題就噁心在資料範圍額。
解題過程:
1.這題寒假做貪心專題的時候做到過,貪心策略大致還記得,就是先按照報酬p從大到小排序,然後依次安排工作,(從di開始往前找到第乙個沒有安排時間的節點)。但是看資料範圍,呵呵呵呵。能過2個點。
2.乙個優化:用乙個father陣列儲存每個時間節點之前的第乙個空位的位置。。 每次沿著father陣列找到第乙個空位。 然後高興地提交了一下,還是2個點。。
3.專題名字是「並查集」,就盡量往並查集的方向想了。發現2中「每次沿著father陣列找到第乙個空位」的過程其實就是並查集的get_father。。那麼就可以用並查集來寫。當乙個位置t已經被占用了,那麼就merge(t-1,t)。 (注意要按順序,必須是t所在集合連到t-1所在集合下面)。 然後又激動的提交了一下,還是2個點。。
4. 再次看了眼資料範圍, 1 ≤ di ,pi ≤ 109 還以為 di的範圍和n是一樣的。。 那麼father陣列根本沒法開到那麼大。。。
5. 感覺思路應該是對的,所以盡量加些優化。。然後就想到可以根據di離散化,按先di排一下序,把di,然後用 乙個d[i]表示di-di-1 。 (去掉重複的點),做出每個di對應的編號。 修改一下前面的演算法,每次get_father找到第乙個空位k,然後d[k]--,如果d[k]==0 ,就merge(k-1,k); 實踐證明此方法可行。。 神奇的並查集。
並查集模板 阿瓦的手套加強版
題目描述 阿瓦所在的幻想世界迎來冬季啦!阿瓦是只可愛的小貓,她為了這個冬天買了好多好多的手套,兔阿卡舉辦了乙個長長的冬眠營並邀請了阿瓦參加,阿瓦準備每天都戴不同的手套。兔阿卡舉辦的冬眠營一共有t天,每一天的早晨,阿瓦都早早地起床挑選手套。她一共有n只手套,每只手套都互不相同。阿瓦每天會在所有的n只手...
bzoj 3674 可持久化並查集加強版
description 自從zkysb出了可持久化並查集後 hzwer 亂寫能ac,暴力踩標程 kuribohg 我不路徑壓縮就過了!ndsf 暴力就可以輕鬆虐!zky bzoj 3673的加強版。就沒了。include using namespace std const int n 200000 ...
BZOJ 3674 可持久化並查集加強版
題意 三種操作 1 合併ab所在集合 2 查詢ab是否在乙個集合 3 狀態回到第x個操作之前。思路 1 每個節點儲存乙個深度 合併時找到兩個節點的根,ra,rb,若ra的深度小,則ra的父親設為rb,否則rb的父親設為ra 2 查詢直接找到兩個的根。這個的複雜度是多少呢?貌似是logn logn。每...