IOI2019題解


由於太懶了,好久沒更新了。發個題解好了。

shoes

首先不難證明鞋子配對一定是從前往后將同一種的左和右配對。

配好對之后首先我們可以假設左在右的左邊,然后討論可知將左邊靠前的排在前面更優。

rect

先考慮只有行限制的情況,那么我們考慮從小到大插入,那么每次極大的區間就是符合題意的,這樣就可以扣出O(n)個區間。

同時我們可以考慮矩形左上角,對於每個左上角考慮每個行區間的延伸長度,每個列區間的延伸長度,合並的時候是一個掃描線。

此外本題也有不帶log的做法,留作習題。

split

假設a<=b<=c,那么顯然有a<=n/3,b<=n/2。我們的目標就是要找到兩個聯通塊,滿足其中一個大小在[a,n-b](或在[b,n-a])。

我們對[a,n-b]和[b,n-a]都運行以下算法,簡記為[l,r]。容易證明l+l<=r。

考慮dfs樹。如果樹上存在一條符合題意的割邊,那么直接輸出即可。

否則考慮重心,我們必然有去掉重心之后的每棵子樹大小<l,否則這棵子樹就符合題意(大小在[l,n/2]之間)。由於只有返祖邊,我們只需考慮下屬各聯通塊到重心的祖先是否有邊。如果沒有,那么它肯定和重心只能同屬一個聯通塊(因為它的大小<l)。如果和重心只能同屬一個聯通塊的大小和>r了那么無解,否則我們先把重心和重心的父親斷開形成兩個子樹,此時重心子樹大小>r,然后我們把能連的子樹一個一個拋棄重心往上面連,直到和重心連在一起的大小<=r,這時我們一定有它>=l,由於l+l<=r。

line

考慮螺旋狀的構造,那么只有卡在角上的情況才會浪費步數。

image

image

把角上單獨拎出來搞成兩條單調折線。

image

需要注意的是這個構造並不對所有數據都有效(角被刪掉之后會產生新角,新角不一定單調),但是可以獲得滿分。

vision

如果不轉坐標系的話可以直接寫個二進制加法器,指令數大概九千多。

轉坐標系就是把曼哈頓改成切比雪夫((x+y,x-y)),這樣就不用算出准確值了。

walk

首先考慮s=0,t=n-1的情況,這種情況我們肯定不會向左走。所以我們一定是每次先豎直移動一段,然后向右走,重復這個過程。

考慮一座橫坐標[l,r]的天橋,如果我們自下而上經過了它,那么不如經過整座天橋。所以我們只需要取出每個天橋斷點和斷點下方第一個在天橋上的點,跑dijkstra即可。

接下來考慮一般情況,我們發現我們可能需要上一些天橋,但是我們注意到比如我們要從起點開始上一個天橋[l,r],如果起點在[l,r]中,我們可能會為了上這個橋往左或往右拐,但是我們只會拐到第一個能上橋的點,否則改成直接上橋不劣,所以我們只需要把橋在左右第一個能上的地方截開。終點同理。

上述東西都可以用掃描線+set來維護。

Reference:

https://blog.csdn.net/qq_39972971/article/details/99547267

https://blog.csdn.net/qq_39972971/article/details/99868638


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM