【轉】天津賽區網絡賽非正式題解 by RoBa

首先聲明:因爲大部分題目是請神牛來出的,有幾個題目我只寫了暴力的驗證程序而沒有實現可以AC的程序。所以我這裏寫的解法有的只是看標程猜出來的,難免有不準確之處。如果有不對的地方,也是因爲我對標程的理解有誤。題目本身的正確性是可以保證的,這個請放心。
A. 首先離散化,然後用一條掃描線從左向右掃描事件,要求一個數據結構可以動態增加和刪除線段,並且可以查詢恰好被覆蓋了K次的區間長度。標程的做法是分塊處理,把整個Y軸分成長度約爲SQRT(N)的小塊,這樣一條線段的中間部分會覆蓋若干整個小塊,兩端的部分逐元素處理。對每個小塊,用一個hash表H維護被覆蓋了i次的長度H[i],以及該小塊作爲整體被覆蓋的次數q。查詢時對每個小塊查詢H[K-q]即可。期望的時間複雜是O(N*sqrt(N))
B. 二分答案,用2-SAT驗證。把每輪遊戲看作一個布爾變量,有兩種取值。假設所有圓的最小半徑爲r,如果不同輪的某兩個圓心的距離小於2r,說明這兩個不能同時選擇。由此得到一系列限制條件,恰好組成一個每個子式都包含兩個變量的合取範式,再判斷這個2-SAT問題是否有解即可。
C. 很讚的題目。我們考慮用一個矩形框住所有點,如果要求矩形邊平行於座標軸,則容易發現結果就是簡單的把x,y座標求最值,得到矩形(minx, miny) - (maxx, maxy)。如果我們要求矩形的傾角爲a,則可以把所有點都旋轉a角度得到新的座標,然後用同樣的方法來做。一個重要的觀察是,f(a) = (maxx - minx) - (maxy - miny)是隨着a的變化而單調變化的。當a從0度增加到90度,f(a)的符號必然變化(當然,也有一直是0的特殊情況……),把f(a)=0的那個時刻用二分法計算出來就可以了。
當然,此題也有其他方法來做,不過這種方法我覺得是最簡捷優美的。
D. 有點麻煩的表達式處理題,基本上大家都要WA幾次才能過。注意負號是可以作爲單目運算符的,而正號不行,比賽的時候很多人問這個地方。還有就是範圍越界的情況可能要尤其注意一下。
E. 如果不考慮那個VIP,N個房間可以被最多K把鑰匙打開的情況,實際上就是1..N的置換組成最多K個環的情況,這個就是第一類strling數之和S1[n][1]+S1[n][2]+...+S1[n][k]。在這些情況裏面,如果鑰匙1恰好鎖在房間1裏也是不行的,所以還要減去N-1個房間被最多K-1把鑰匙打開的情況數。
F. 水題,O(n^2)直接寫就可以。
G. 我還沒看懂標程是怎麼做的,貌似是很神奇的解法。此題題解待補充。
H. 數學題,求曲線積分以後可以得到耗能關於時間t的函數e(t) = X * sqrt(w^2*r^2+v^2) *
(t*v*sqrt(r^2+t^2*v^2) + r^2*log(2*v*(t*v+sqrt(r^2+t^2*v^2)))) / (2*v),此函數關於t單調增,二分求解e(t)=E即可。注意特殊處理r=0的情況。
I. 如果四個點不能組成凸四邊形,則必然是其中三個點組成一個三角形,另一個點在該三角形內部。於是我們可以O(n)枚舉一個點作爲內部中心,試圖從其他的點裏選出三個來,組成三角形把它包圍住,看看有多少種可能的選擇。繼續觀察發現,如果三個點不能圈住中心點,則必然是存在一條通過中心點的直線,使得這三點都在直線的同側。於是我們可以把所有點(除了中心點)按極角排序,然後線性轉圈掃描一下就可以統計出來了。總的複雜度是O(n^2*logn)
J. 最後的矩形一定是在四個方向都遇到了-1或者邊界才停止擴張。預處理出每個點(i,j)向左能擴張到的點L[i][j],向右能擴張到的點R[i][j]。對每個查詢,外層以y遞增,內層以x遞增的順序枚舉(x,y),假設此點是矩形的底部,並且矩形是向上擴張直到某個(k,y)爲-1或邊界(這裏kK. 每當一個點x被mark的時候,對所有點對(i,j),更新cost[i][j] = min(cost[i][j], cost[i][x] + cost[x][j]),複雜度爲O(N^2)。這種操作最多有N次,故總複雜度是O(N^3)

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