2017 NEERC
Problem A. Archery Tournament
題目描述:在二維平面上,會陸續出現一些圓,以及一些詢問,詢問點是否在圓內,如果是,則輸出那個圓,並把那個圓刪掉,否則輸出\(-1\)。注意:這些圓均與\(x\)軸相切,並且這些圓不會相交。
solution
因為這些圓都與\(x\)軸相切,所以經過直線\(x=x'\)的圓不會超過\(log\)個。所以只要找出詢問點的左右\(log\)個圓逐一判斷即可。
時間復雜度:\(O(nlog10^9)\)
Problem B. Box
題目描述:用一張\(n \times m\)的網格紙,折出\(a \times b \times c\)的長方體。輸出是否可解。注意:折痕只能是網格線。
solution
題解:答案只有兩種情況:
- \(3b+a+c \leq w\)且\(a+c \leq h\)。
- \(2a+2c \leq w\)且\(a+2c \leq h\)。
\(a, b, c, w, h\)全部組合一下。
時間復雜度:\(O(1)\)
Problem C. Connections
題目描述:給出一個頂點數為\(n\)的有向圖,刪掉一些邊,使得只剩下\(2n\)條邊,且任意兩點能互相到達。
solution
從\(1\)開始搜索,搜到的邊為留下的邊。然后將邊的方向全部相反,從\(1\)開始搜索,搜到的邊也是留下的邊。這樣就有至多\(2n-2\)條邊,剩下的隨便補足\(2n\)條就好了。
時間復雜度:\(O(n)\)
Problem D. Designing the Toy
題目描述:給出一個由\(1 \times 1 \times 1\)方塊組成的立體圖形的正視圖、側視圖、俯視圖的面積,問是否存在一種堆積方式,滿足題目所給的數據。
solution
假設面積分別是\(a, b, c, c \geq max(a, b)\),將面積為\(a\)的面變成\(a \times q\),面積為\(b\)的面變成\(b \times 1\),然后就相當於在一個\(n \times m\)的網格中填\(c\)個格子,所以如果\(c>ab\),則無解;否則先填滿對角線,剩下的隨便填就好了。之所以把面變成\(a \times 1\)和\(b \times 1\),是因為這樣子能填的方塊最多,即\(ab\)。
時間復雜度:\(O(c)\)
Problem E. Easy Quest
題目描述:有\(n\)個關卡,每個關卡為一個數字\(a_i\)。如果\(a_i>0\),則是武器,如果\(a_i<0\),則是怪獸,只能用值為\(-a_i\)的武器殺死,如果\(a_i=0\),則可以生成一個任意值的武器。問是否能通關,若能,則每個\(a_i=0\)應該生成什么武器。
solution
貪心,盡量先用已有的武器,再用能生成任意值的武器。
時間復雜度:\(O(n)\)
Problem F. The Final Level
題目描述:用長度為\(n\)的\(L\)型方塊擺在二維網格平面上,僅通過方塊從\((0, 0)\)走到\((a, b)\)。輸出方案。
solution
為了方便,可以先將\((a, b)\)映射到第一象限。然后貪心構造方案。可以逆着構造,zhe這樣對於邊界的判斷會方便一些。
時間復雜度:\(O(n)\),\(n\)為方塊數
Problem G. The Great Wall
題目描述:現要建一堵長度為\(n\)的牆。第\(i\)段牆有三個屬性值\(a_i, b_i, c_i\)。現給定一個值\(r\)。自行選定兩個值\(x, y\),形成兩個區間\([x, x+r-1], [y, y+r-1]\),這兩個區間必須包含於\([1, n]\)。\(x, y\)對應的牆的值為\(\sum v_i\),當\(i\)不屬於任一區間時,\(v_i=a_i\);當\(i\)只屬於一個區間時,\(v_i=b_i\);當\(i\)屬於兩個區間時,\(v_i=c_i\)。求出第\(k\)小的牆的值。
solution
先將\(b_i-=a_i, c_i-=a_i, a_i=0\)。
二分答案\(value\),判斷有多少個數對\((x, y)\)小於等於\(value\)。
先處理區間不相交的情況。預處理\(h_i=\sum_{j=0}^{r-1} b_{i+j}\),枚舉\(i\),假設\(y=i\),然后用\(multiset\)之類的數據結構,計算出有多少對\((x, y)\)小於等於\(value\)。
接着就是構造兩個函數。
這樣,數對\((x, y)\)的相交區間的值為\(g_x+f_y\)。這樣就可以用與上面一樣的方法來求出有多少對\((x, y)\)小於等於\(value\)。
時間復雜度:\(O(nlogn)\)
Problem H. Hack
題目描述:
1 modPow(a, d, n) {
2 r = 1;
3 for (i = 0; i < 60; ++i) {
4 if ((d & (1 << i)) != 0) {
5 r = r * a % n;
6 }
7 a = a * a % n;
8 }
9 }
其中只有第\(5, 7\)行耗時間,若表達式為\(x*y%n\),則時間為\((bits(x)+1)(bits(y)+1)\),\(bits(x)\)為二進制位數。已知\(n, d\)是這樣生成的:首先隨機找兩個二進制位數為\(30\)的質數\(p, q\),其中\(n=pq\),而\(d\)由\(1\)~\(\phi(m)-1\)隨機選取,且與\(m\)互質。現給出\(n\),每次可向系統輸出一個\(a\),系統返回所需的時間。最后確定\(d\)。
solution
待解決。
Problem I. Interactive Sort
題目描述:隨機生成一個\(n\)排列,將奇數按順序設為\(o\)數組,將偶數按順序設為\(e\)數組。每次向系統輸出一個數對\((x, y)\),系統返回\(o[x]\)與\(e[y]\)的大小關系,最后確定\(o, e\)數組。
solution
判斷\(o[1]\)與\(e\)的所有數的大小關系,從而確定\(o[1]\),也同時將\(e\)分成小於\(o[1]\)和大於\(o[1]\)兩部分,以此類推,會將\(e\)分成\(i+1\)份,在以后的判斷中,只要從\(i+1\)份中每份選一個數與\(o[i]\)比較,即可將\(o[i]\)的大小范圍縮小到兩份,再與這兩份中每一個數相比較即可。
時間復雜度:\(O(nlogn)\)
Problem J. Journey from Petersburg to Moscow
題目描述:有一個有邊權的無向圖,一條從\(1\)到\(n\)的路徑的長度為路徑中最長的\(k\)條邊的和,如果路徑中不足\(k\)條邊,則為全部邊的和。問\(1\)到\(n\)的最短距離。
solution
待解決。
Problem K. Knapsack Cryptosystem
題目描述:有一個數列\(a_i\),且滿足\(a_i>\sum_{j=1}^{i-1} a_j\),設\(q=2^{64}, r\)與\(q\)互質,且為一個正數。令\(b_i=(a_i \cdot r) mod q\)。現生成一個數\(num\),將\(num\)的二進制中為\(1\)的位\(i\)找出,令\(s=\sum b_i mod q\)。現給出\(s\),求\(num\)。
solution
假如\(n \leq \frac{2}{3}logq\),則可以將\(n\)分成兩半,然后爆搜出兩半分別能構成的和,再枚舉其中一半的和,另一半能單調枚舉。
假如\(n > \frac{2}{3}logq\), 因為\(a_i>\sum_{j=1}^{i-1} a_j\),所以\(a_1 < \frac{q}{2^n}=t\),所以可以枚舉\(a_1\),又因\(r\)為奇數,\(q=2^{64}\),所以\(a_i\)與\(b_i\)最低位\(0\)的個數相同,設個數為\(z\),所以只需要枚舉\(\frac{t}{2^z}\)。
其次可以根據\(a_1\)與\(b_1\),算出\(r\),但\(r\)的最高\(z\)位是不確定(因為被模了),所以可以枚舉最高位\(2^z\)。然后逐一算出\(a_i\),看\(a_i\)是不是指數增長,若是,則找到了對的\(r\),然后從大到小貪心分解\(s\),得到答案。
時間復雜度:\(O(\sqrt[3]{q})\)
Problem L. Laminar Family
題目描述:給出一棵樹,用很多數對\((x, y)\)的路徑覆蓋樹,如果路徑有相交部分(包括點相交,但不算互相包含),則輸出\(No\),否則輸出\(Yes\)。
solution
樹鏈剖分。將數對按路徑長度從長到短排序,然后對每個數對隨機生成一個數值\(key\),將路徑上的每個點都異或這個值,判斷時只要判斷路徑上每個點的值是否都相同。
時間復雜度:\(O(nlogn)\)