1. 程式人生 > >Petrozavodsk Summer Training Camp 2017

Petrozavodsk Summer Training Camp 2017

一次 則無 操作 spa AC -o 最大 paint hash

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