1. 程式人生 > 其它 >K-M

K-M

K. Hemose on the Tree

題意:給定有2的次冪個結點的樹,試給每個節點和每條邊賦一權值,使得對於從某指定根節點出發,到任意一結點的簡單路徑上權值異或和最大值最小。要求權值取遍[1, 2n-1].

解:有兩個需要確定的東西:根節點、最大權值異或和,以及如何取遍[1, 2n-1]. 根據異或的性質可以感受到根節點不太重要,那麼先確定最大權值。所有點取值範圍在二進位制下為[00001, 11111]這樣的形式,通過兩個良心樣例可以盲猜權值異或和的最大值最小為n。稍微思考一下,最高位的1是肯定會有一個的,如果讓它最小,顯然後面都是0,也就是取n最理想,而樣例證明了可以取到(沒有樣例,難度加倍)

。現在考慮如何構造。順勢以n為根節點。對於任意一個數a,如果a>n,則a^(a-n)=n;a<n時同理,也就是假設n=8,可以1,9,2,10這樣子成對填;這樣每對之間異或值為n,n^n=0。如果都是結點的話挺麻煩的,但現在邊和點都有權值,剛好形成一對一的關係,直接填就是了。好題!

L. Fair Share

題意:給出若干個長度為偶數的數列,問是否有一種方法,使得從每個陣列中取出一半陣列成新陣列L,剩餘部分組成新陣列R,且L與R的元素相同。

解:又是一個和2相關的構造題,上一個和2相關的題在兩兩分組,這個題雖然不能這麼做,但也像是亂搞一番後再分配L和R。看到L和R有一種連邊的衝動,但直接和L或者R相連不能保證從每個陣列中剛好取一半。試圖給每個數和陣列編號連邊,即,如果陣列a包含2和3,那麼a和2,a和3各連一條邊。那出現兩個2怎麼辦呢。考慮連邊的意義,我們需要每個陣列有一半是出邊,那還有一半肯定得是入邊。重新理解一下入邊,即最終形成的陣列有一個元素來自a。那出現兩個相同的數就連兩條邊。最後發現,可以將出邊分配給L,入邊分配給R,構造一個歐拉回路,各種意義上都符合題意,但又有點講不清的感覺,很神祕。

M. Circular Spanning Tree

題意:給出一個01串,將這個串按順時針排成一個圈,每個0/1代表一個點。要求拿這n個點構成一棵樹,有0的點度數為偶數,1的點度數為奇數。給出連邊方案,其中每條邊都為直線,且兩兩不相交。

解:拿樣例開始畫,發現應該用0和1的奇偶性構造。這樣一共有4種可能,每種分類討論一下可能能出,但可以預見還要討論1和2的特殊情況,一個構造題做成這樣八成是錯了。首先全是0的情況排除,全是1只能有偶數個1,突然想起來離散數學好像學過一棵樹只能有偶數個奇數度的結點,很快樂。為了減少分類討論拿一個1作根,然後把0串起來,剩下奇數個1接到0上剛好,但邊會交叉,煩。考慮給1接相鄰的0,最後把0串起來,那還是要討論接奇數個1還是偶數個1。再次分析,首先0是肯定要串起來接到根節點上的,剩下的1肯定是要當葉子結點的。把相鄰的0串起來,最後接一個1,分成好幾段接到根節點上,這樣就不會交叉了。對於剩下的1,直接接到根節點即可。