1. 程式人生 > >【題解】:中南大學第十二屆大學生程序設計競賽

【題解】:中南大學第十二屆大學生程序設計競賽

最小 lars 樹狀 大學生 感覺 比賽 相對 程序設計 競賽

ps:感覺比昨天晚上的華師題目質量高一點,至少emmm,題面沒有那麽多bug。

下面忽略了水題,只給出我覺得有價值的幾個題目的題解和代碼:

【C:神山神石】:

題意:

每一天,Wells可以餵神山一個神石,使得神山的高度變為原高度乘上神石的能力值,或者使得所有的神石能力值+1。第 0 天時,所有神石的能力值為 0,神山的高度為 1。Wells想知道神山最快的長成剛好某一個高度值最少需要多少天。輸入L,R,P(L,R<1e9; P<=100);求多少個x滿足L<=x<=R,最小天數小於P。

思路:

註意是剛好長到x的最小天數,不能超過x。通過暴力搜索,我們發現能夠再100天內長到的高度並不多,所以我們應該想辦法找到可以長到的高度,然後判斷是否在[L,R]區間裏(然而我比賽的時候只能求出20天以內長到的高度)。

【D:I‘m new here】

題意:

給定一棵樹(N<1e5),樹邊上有邊權,現在求任意點對的路徑異或值的和。

思路:

因為兩點之間的異或Xor(u,v)=Xor(root,u)^Xor(root,v)。所以我們DFS得到每個點到根的異或值Xi。然後計算兩兩異或值。因為異或沒有結合性,所以不能用前綴和來計算。正確的打開方式是對每一位sig,我們計算1的個數(cnt)和0的個數(N-cnt),那麽這一位的貢獻就是cnt*(N-cnt)*(1<<sig)。然後累計即可。(但是比賽的時候打死也沒有找到bug。。。真讓人腦殼大)

【E:EZ‘s binoculars】

題意:

給你一些點(N<1e5),然後其實是每次詢問給你一個中心在( x , y )的四邊相等的菱形,對角線長為d,求問多少點在菱形裏。

官方題解:

首先可以想到二維樹狀數組維護。但是顯然內存不允許,時間復雜度也不允許。 所以需要離線優化 那麽考慮優化,可以基於離線排序後優化。現將所有的點P按照( x + y )關鍵字排序,然後將菱形的四個點按照( x + y )排序。 那麽,每次如果P的(x+y)<= 菱形的(x+y),那麽將p的(y-x)離散化後的值插入到樹狀數組 那麽查詢菱形中一點 t 下方有多少個點時,就是查詢小於等於t.y - t.x的點的個數,樹狀數組查詢即可(必須離散化後查詢)。 所以時間復雜度就是O(nlgn)。

【J:Pigs can‘t take a sudden turn】

題意:

兩個點以兩個恒定的速度移動,問過程中兩點的最短距離。

思路:

可以三分;可以用二次函數不等式(特判相遇的情況); 也可以:

用相對運算,假設一個點不動,則另一個點的相對運動軌跡就是一條線段,然後求點到線段最短距離。

【題解】:中南大學第十二屆大學生程序設計競賽