模擬測試58

2022-05-06 20:51:11 字數 988 閱讀 6877

t1:

每個數至多有$2 \sqrt$個約數,也就是說即使$n$很大,在數集中有倍數的數在$m \sqrt$級別。

可以暴力篩出數集中每個數得約數,用hash表維護一下,可實現$o(1)$查詢。

用$n$減去篩出的數個數即為答案中0的個數,但是注意超過$n$的數要刪掉。

時間複雜度$o(m \sqrt)$。

t2:我們發現每個物品的花費很大,價值卻很小,於是我們可以將價值做揹包,求出每個花費對應的最小代價。

然後將詢問離線排序,從時間較早的計畫做起。

將所有商店也排序,從早到晚列舉計畫,用單調指標維護當前可以買到東西的商店。  

如果有新的商店加入,就再做一輪揹包dp。

揹包dp同時維護乙個花費的字尾最小值,用於二分查詢最大的可以獲得的價值。

時間複雜度$o(n^3+mlogn)$。

t3:最長路即是樹上直徑。

樹上直徑可以用並查集維護。

將兩個連通塊連線,新的直徑一定是由原先兩條直徑的四點中的兩點組成的。

在並查集的代表元素上維護直徑的兩個端點,合併時分6種情況討論即可。

而這六種情況的長度都可以在原樹上用lca或樹剖求出。  

但是次題還有上界限制,也就是說我們需要分離並查集。

用平衡樹維護可持久化並查集?

考慮類似線段樹分治的思路。

對於速度值域開一棵線段樹,把每條邊像線段樹區間查詢一樣加進去,一條邊至多被劈成$log(r-l)$段。

然後dfs遍歷整棵線段樹,到乙個節點將這個節點的邊加上,同時用棧維護加邊前並查集的狀態。

回溯時直接彈棧,將並查集連的邊分離即可。

由於要維護結構,並查集不能用路徑壓縮,只能按秩合併。

處理出來所有答案,$o(1)$回答詢問即可。

遍歷線段樹是$o(n)$的,而每次查詢是$o(mlogn)$的,所以不能每次都查詢。

由於一共有$m$條邊,每條邊至多被劈成$logn$段,外加並查集的複雜度$o(logn)$,總的時間複雜度為$o(nlog^2n)$。

考試反思 1003csp s模擬測試58 沉澱

穩住陣腳。還可以。至少想拿到的分都拿到了,最後一題的確因為不會按秩合併和線段樹分治而想不出來。對拍了,暴力都拍了。挺穩的。但是其實也有波折,險些被卡記憶體。如果記憶體使用不連續或申請的記憶體全部使用的話,切記計算記憶體,一點都不能開大。t1 divisors 直接根號篩,拿map也能過。遍歷map直...

58測試崗面試

一面 1.專案經歷 2.mysql題目 連線a,b兩表通過id連線,並按照時間排序,且列印出1000 1999行資料 select from select from a union select from b as c ordder by creat time desc limit 1000,199...

csp模擬 模擬測試16

fdasds include using namespace std define cle a memset a,0,sizeof a inline int read const int mod 1e9 7,maxn 1e3 100 int n,m,ans 0 int f maxn maxn int...