人生中第乙個大分塊。
給出乙個長度為 \(n\) 的數列 \(a\),\(q\) 次操作,支援查區間 \(k\) 小以及將乙個區間中所有 \(x\) 變成 \(y\)。
資料範圍的話 \(1\leq n,q,a_i\leq 10^5\)。
首先考慮沒有修改的情況。
很容易想到塊內維護有序序列然後二分答案,這樣複雜度基本就是 \(o(\sqrt\log n)\),不太能過而且也不太能支援修改的樣子。
換一種思路,用值域分塊維護,就是將值域分成 \(\sqrt n\) 個塊,每個塊內維護乙個值在這個塊的值域中的元素的個數。
這樣我們從第乙個塊開始往後掃,累加掃過的塊的值,當掃到乙個塊 \(i\) 使得這個累加值大於等於 \(k\) 時就說明第 \(k\) 小元素在這個塊裡,然後再掃這個塊即可。
這樣我們會掃過不超過 \(\sqrt n\) 個塊以及乙個塊內不超過 \(\sqrt n\) 個元素,時間複雜度就是 \(o(\sqrt n)\)。
然後考慮如何維護這個值域分塊,我們可以字首和一下,記乙個 \(\sigma[i][j]\) 表示前 \(i\) 個塊中值域在第 \(j\) 個塊的元素個數,\(\phi[i][k]\) 表示前 \(i\) 個塊中值為 \(k\) 的元素個數。這倆東西分別可以 \(o(n)\) 和 \(o(n\sqrt n)\) 預處理出來。
那麼我們詢問乙個區間的時候就可以 \(o(1)\) 地差分出整塊的值域塊,然後花費 \(o(\sqrt n)\) 的時間將散塊的資訊加進去即可。
HYSBZ 5145 未來日記
題意 給定乙個長為 n 的陣列 a,有 m 個操作,1,l,r,x,y,把區間 l,r 的所有 x 變成 y 2,l,r,k,查詢區間 l,r 的第 k 小值。n,m,a ia i ai 1e5 解題思路 直接考慮分塊 bushi 首先講一講靜態 動態區間 k 小 o n n o n sqrt o ...
2018 未來已來
2017年11月15日,infor大中華區使用者暨合作夥伴峰會在上海外灘w酒店成功舉辦。本次峰會以 聚勢謀遠,協力必達 為主題,近三百位來自中國大陸,香港和台灣各行各業的重要客戶代表 業界精英 行業專家 記者及合作夥伴應邀出席。infor向與會者分享了infor全球戰略 雲業務及infor birs...
2023年目標 計畫未來
2018年已經開始,一天又一天的在流淌著,畢業歷來,感覺每年的時間都過得飛快,還沒掙到錢就年尾了。每個人的人生目標不同,大家努力追求的方向也不一樣.一直以來我也在拼命努力著,想要提高自己的能力和掌握更多的技能,為家庭創造更多的財富,掙更多的錢。我並不是乙個拿名利作為價值觀的人,也不是把擁有很多錢當作...