雜題記錄

[WC2006]水管局長

題面:

[WC2006]水管局長

題解:

首先根據一些常識,我們可以發現,符合要求的邊一定在最小生成樹上,因爲有刪邊操作,因此我們需要做的就是動態維護最小生成樹。
因爲刪邊不好處理,因此我們可以直接倒着處理,這樣刪邊就變成加邊了。
因爲要維護邊,因此我們考慮將每條邊都視作一個帶權中轉點。即對於x --- > y的邊,連x ---> now --- > y,其中now爲一個帶權點。
同時如果已經構成一棵樹,我們要再往裏面塞邊的話,就必須要刪掉一條邊,否則會構成環。
因此對於一條連接x ---> y,邊權爲\(k\)的邊,我們查詢x -- > y路徑上邊權的最大值\(maxn\),那麼會有2種情況:

  • \(maxn > k\),那麼說明插入這條邊是優的,因此我們刪去最大值所代表的邊,加入當前邊
  • \(maxn \le k\),那麼說明保留最大值比較優,所以我們忽略這條邊,不進行修改。

然後就可以了。

[FJOI2015]火星商店問題

題面

[FJOI2015]火星商店問題

題解

觀察到,如果沒有最近d天的限制,那麼我們只需要將所有物品按照所屬商店的順序加入可持久化trie樹。
如果我們要查詢商店編號在\([ll, rr]\)之間的最大xor值,那麼我們只需要查詢區間\([l, r]\)內的xor最大值即可。
其中\(l\)表示第一個屬於查詢範圍內的物品編號,\(r\)表示最後一個屬於查詢範圍內的物品編號。
具體如何獲取這2個編號?因爲物品是按照所屬商店順序加入的,所以我們只需要在加入的物品序列中二分一下就可以了。
那麼再考慮最近d天的限制。
相當於是查詢商店編號屬於\([ll, rr]\),時刻屬於\([l, r]\) 內的最大xor值。
我們考慮線段樹分治。
對於每個詢問區間,我們將它的查詢時刻區間分成log段,掛在線段樹上。
對於每個物品,因爲我們需要將物品按照所屬商店的順序加入,因此對於線段樹上的每個區間,我們都需要重建整個可持久化trie樹。
不過因爲物品是一個單點修改,因此就算我們在每個包括了這個物品的區間都放一個這個物品,每個物品也最多放log個。
因此我們在每個包括了這個物品的區間內放一個這個物品,然後每到一個區間,就取出所有在這個區間內出現過的物品,重建整棵trie樹。
然後對於每個掛在這個區間上的詢問,二分我們需要查詢的物品區間,在可持久化trie樹上查詢並更新這個詢問的答案。
最後再輸出即可。
複雜度是\(O(nlog^2n)\)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章