Petrozavodsk Summer Training Camp 2017
Petrozavodsk Summer Training Camp 2017
Problem A. Connectivity
題目描述:有\(n\)個點,現不斷地加邊。每條邊有一種顏色,如果一個點對\((a, b)\),滿足\(a=b\)或對於每一種顏色的子圖(圖中只有該種顏色的邊),\(a, b\)總是連通,則該點對稱為好連通。求出每加一條邊,好連通的點對數。
solution
每個子圖用並查集維護連通塊,並且用\(vector\)記錄每個連通塊的點,便於之後進行答案的統計,合並時啟發式合並即可。
每種顏色生成一個\(hash\)值,每個點記錄一個\(hash\)值,表示在每個子圖中是屬於哪個並查集,若兩個點的\(hash\)
時間復雜度:\(O(mlogn)\)(常數比較大)
Problem B. Hotter-colder
Problem C. Painting
題目描述:有連續\(n\)個,每個點開始時都沒有顏色,現在每次選擇一個連續的區間,然後將這個區間塗成一種顏色,使得最終變成目標的樣子。顏色有\(m\)種,每種顏色至少出現一次,塗色也只能塗\(m\)次,每次塗色的花費為區間長度。問總花費的最大值。
solution
可以先預處理出每種顏色的最小塗色區間,由於數據的特殊性,這些區間是不相交的,只可能是相離或包含。這樣就可以按嵌套關系將區間分成很多層,必須先塗外層,再塗內層。對於同一層的區間,再分成很多段,每一段是連續的相鄰的區間,每一段用\(dp\)
時間復雜度:\(O(n^2)\)
Problem D. Ones
題目描述:定義一種1-expressions
\(E ::= 1 | E+E | E*E | (E+E) | (E*E)\),給出一個數\(k\),用一個不多於\(100\)個\(1\)的表達式,使得答案為\(k\)。
solution
偶數時除於二,奇數時減一。
時間復雜度:\(O(logk)\)(每次詢問)
Problem E. Seats
Problem F. Ants
Problem G. Permutation
題目描述:給出一個\(n\)排列\(p_i\),將其分成兩個子序列,使得一個子序列遞增,另一個遞減。或無解。
solution
貪心。假設枚舉到第\(i\)個數,如果\(p_i\)小於遞增序列最後一個數,則扔進遞減序列,若大於遞減序列最後一個數,則扔進遞增序列,若兩個條件都滿足,則無解。如果是介於兩者之間,則考慮\(p_{i+1}\),若\(p_{i+1}>p_i\),則扔進遞增序列,否則扔進遞減序列。
時間復雜度:\(O(n)\)(每次詢問)
Problem H. Primes
題目描述:定義\(\pi (x, y)\)表示能同時整除\(x, y\)的質數個數。給出\((a, b)\),求出\(\sum_{a \leq x < y \leq b} \pi(x, y)\)
solution
答案為\(\sum_{d} \left \lfloor \frac{b}{d} \right \rfloor - \left \lfloor \frac{a-1}{d} \right \rfloor\),\(d\)為質數。然後其實對於不同的\(d\),裏面的值也可能一樣,可以將值一樣的\(d\)一起算,也就是跳著跳著算。
時間復雜度:\(O(log^2n)\) (每次詢問)
Problem I. Vertex covers
Problem J. Scheduling
題目描述:有\(m\)個線程,有\(n\)個需要執行的程序,每個程序需要在時刻\(p_i\)到\(k_i\)內執行,執行時間為\(c_i\),每條程序可以隨意暫停,跳轉線程,但同一線程同一時刻只能執行一條程序。問是否能執行所有程序。
solution
將時刻拆分成若幹個區間,每個區間連向匯點,流量為區間長度,每個程序連向源點,流量為程序的執行時間,然後每個程序連向所在的區間。跑一遍網絡流就可以了。
時間復雜度:\(O(n^2m)\)
Problem K. Shufe
題目描述:有\(2^n\)張牌,有一種洗牌的方法:1、如果只有兩張牌,則交換它們。2、將牌分成上下兩堆,交換兩堆牌,然後每堆牌遞歸操作。問洗\(t\)次牌後的順序。
solution
顯然,洗一次牌後所有牌會調轉,再洗一次就會變回原樣。
時間復雜度:\(O(2^n)\)
Petrozavodsk Summer Training Camp 2017