20220317 刷題日記

P7514

把昨天空閒時候想出來的卡牌遊戲寫了。有一點不優美的地方是關注到所有的上界是所有出現過的數,而不是 \(a\) 數組中的數,這個坎導致我的思路走了一些小小的彎路。

CF1017G

如果忽略 2 操作,等價於詢問一個點到根路徑上是否存在一個後綴使得這一條後綴上的操作次數和大於等於深度之差。

考慮到關於深度,一個常見的思路是每個點都初始爲 1 或 -1 來吧深度之差幹掉。

這裏每個點初始爲 -1,這樣就等價於詢問一條最大後綴滿足和爲 \(0\)

然後考慮 \(2\) 操作,首先等價於子樹清空,然後考慮如果詢問該子樹的最大後綴,可能還是會有問題,因爲上面的信息可能傳下來,我們只需要在根節點上進行對應的相減即可。

P4748

如果 \(k\) 是答案,一個必要條件是 \(k+1|n\),我們考慮這樣每一個連通塊的大小我們是能夠知道的。

考慮一條邊會被割,必要條件是割完這條邊,兩個連通塊的大小必須都是我們已經算出的那個連通塊大小的倍數。

考慮滿足上面的條件的邊一共有幾條,考慮如果一個 \(k\) 是答案的話,上面的邊一定恰好有 \(k\) 條,否則一定不足 \(k\) 條,可以通過反證法證明不可能超過 \(k\) 條。

於是處理出來子樹大小即可。由於 \(10^6\) 以內的因子個數最多有 \(240\) 個,所以可以暴力枚舉。

P7880

思路具有極大的啓發式意義。

首先考慮數顏色問題,序列上的話我們只需要考慮最後一次出現的位置。書上也是一樣,考慮到 lca 其實只有 \(O(n)\) 個,對於三個點對 \((b,c)(a,c)\) 如果他們的 \(lca\) 一樣的,且滿足 \(a<b<c\),那麼我們可以看到如果一個區間可以包含 \((a,c)\),那麼一定可以包含 \((b,c)\),所以 \((a,c)\) 是無用的。

這是一個很關鍵的點,因爲這樣有效降低了我們的點對數量。現在點對變成了一個點,在其他的子樹內的前驅後繼。我們考慮這樣的點對數仍然很多。

我們考慮啓發式合併的做法,每次把小字樹合併到大子樹裏,順便維護小子樹內的每個點在大子樹內的前驅後繼,這樣的話我們的點數就和啓發式合併的合併次數一樣了,爲 \(O(n\log n)\),由於查前驅後繼有 set,所以是兩個 \(\log\)

考慮一個點對 \((a,b)\) 表示當 \(1\le l\le a,b\le r\le n\) 的時候會出現這個顏色。把這個東西映射到二維平面上,然後發現是這樣的一個結構:

圖有問題的一點是,需要保證 \((a,b)\) 中的 \(a<b\),不過小問題。小於的原因是這裏表示的是關於範圍的限制。

那麼我們想要做的其實是對每個顏色,所有這樣的矩形做一個面積並,然後把面積並加一,這樣單點查就可以做完了。

但實際上就是這裏罰坐了兩個小時。

我們考慮從左往右掃,不好做,爲什麼?因爲這個東西是從高到低的。

但是從下往上掃是從低到高的。

所以我們考慮從下往上掃,維護每個顏色的當前高度,及時更新,加入一個顏色的時候,要先刪掉,然後再加上這時的最大值帶來的影響,因爲是前綴,所以用樹狀數組即可。

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