[solution] 2020-2021 ICPC Northwestern European Regional Programming Contest
沒有寫的題目都是隊友寫的
CodeForces Handle: temmieowo
Email: kapoo950807@gmail.com
首先,可以發現到這道題在不考慮時間複雜度的情況下可以用 DP 解決。我們令 為當查詢為 時的答案,,可以這樣轉移,所有:
這樣的時間複雜度是 ,其中 為查詢的最大值,顯然無法通過此題。
性質 A1
設 是 中,使得 最小的 。若任意原子 被使用了 次,則改為讓 原子使用 次不會變得更差。
證明
因為 ,因此 。
由 性質 A1 可知,每個非 的原子至多只會被選到 次,因此只需預處理前 個 dp 值,剩下的一定會由 轉移。
因此對於每個查詢 ,若他在我們預處理的範圍內,則可以直接使用;否則我們可以找到最小的一個數 不大於 ,使得 ,則答案為 。
這樣的時間複雜度為 的時間複雜度解決。但實際上,可以做到比這個時間複雜度更好。
性質 A2
若選擇了 個非 的原子,則必定可以從這 個原子找到一種取法(也就是只選一些被選擇的原子),使得該取法中重量的總和為 的倍數。
證明
假設有一個長度為 的布林陣列 ,第 項代表「是否有取法的總和 為 」。

並令 代表我們取的任意 個非 的原子。
若所有的 都能使 為 true
,則證畢。用反證法證明,假設存在一種 使得 不為 true
,則 (裡面的每一項都要 ) 都不為 。
由鴿籠原理可知 個格子放 個數值,則必定有數值相同,假設 () 的話,就代表 ,矛盾。
由 性質 A2 可知,只要選了不小於 個非 的原子,則必定可以湊出 的倍數,但因為 的每單位重量的價值一定比所有人都還要好,所以上述提到湊成 的倍數的方法,應該全部都要換成 。
在最糟的情況下 ,則只需要預處理 個 dp 值,接著用與前面相同的作法即可。
觀察 E1
可以在 的時間內,檢查 Alice 是否能走到 Bob(或相反)。
說明
我們枚舉所有 Alice 走的位移,假設對於位移 ,Alice 走到的新位置是 ,那我們只要檢查是否存在能夠讓 走到 Bob 的位移,後面這件事情可以用二分搜達成。
根據 性質 E1,我們可以先判斷 Alice 是否能贏。否則 Alice 應該要走到一個 Bob 走不到的地方,然而 性質 E1 並不能做到這件事。
性質 E2
Bob 至多只能走到 個座標。
證明
假設 Bob 需要走兩步,在最差的狀況中,所有可以走的位移是 ,總共有 對,但 跟 根本就一樣,因此至多 個可能。
如果只走一步,就有 個可能。
至多只能走到 種不同的座標。
這代表了我們任意選棋盤上的一格,大概有 可以選到 Bob 走不到的點,檢查該格是否為 Bob 能走到的點可以用 性質 E1 的方法。
隨機選取 格就有 的機率可以選到 Bob 走不到的點,這個機率足夠小。若到最後仍找不到 Bob 走不到的點,就代表 Bob 獲勝,否則可以找到 Alice 走到平手的座標。
這道題我們將直接模擬題目的要求,這裡提醒一下題目有提到「每次相撞只會有恰好兩台無人機」,很好證明每次相撞的一定是相鄰的兩個無人機。
觀察 F1
可以在 的時間內,計算一對無人機相撞時的時間。
說明
一對無人機 (假設 )的相撞時間取即為 。若 ,也就是 ,那代表它們根本不會相撞。
觀察 F2
可以在 且僅用整數的方法,比較兩對無人機相撞時間的先後。
說明
如果我們想要使用整數比較兩對無人機 跟 (假設 且 )相撞時間的先後,根據 觀察 F1,代表在比較 跟 的大小關係。
如果 或 ,畢竟它們永遠不會相撞,時間記為 ,可以直接使用條件判斷。
否則若 且 ,則:
這個不等式可以用整數判斷。
為了模擬題目內容,我們希望可以達到動態更新(因為無人機會相撞)找到相撞時間點最小的相鄰無人機對,這不難想到用 set
維護。
將所有相鄰無人機對墜毀的時間點放入 set
,因為 性質 F2 所以 set
動態更新時間複雜度仍然是 。
每次都要找到墜毀時間點最小的無人機對,直到無人機全部都墜毀,或是剩下的無人機對都不會相撞。接著把它刪除,並修復 set
維護的狀態,如下圖:
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
我們可以在原題加上兩個特技,分別為「」、「」。
令 為「從第 開始(還沒完成 的 trick)到終點,已經用了 秒的 delay 的期望總時間」。顯然的,。
依照題意,可以這樣轉移:
這樣的 dp 定義與轉移使得我們必須要從 做到 ,但是中途卻又用到 ,這樣的 順序難道是不好的嗎?
性質 G1
令 算出來的 稱做 。若 ,則 應該要變的更大;若 ,則 應該要變的更小。
證明
先說結論, 的圖形應該要是非遞減的,而我們要找到它與 的交點。

讓我們拆解 代表的遞迴式,它形如 ,這裡的 是一些常數。
可以發現當 變大時, 只會變大或不變;當 變小時, 只會變小或不變。
有了 性質 G1,就可以二分搜這個 ,這樣就解決了這道問題。
陣列排序後可以這樣構造,偶數的情況要注意方向
Image Not Showing
Possible Reasons
- The image was uploaded to a note which you don't have access to
- The note which the image was originally uploaded to has been deleted
Learn More →
首先可以 枚舉所有可能,並在 的時間複雜度檢查三個人是否相撞,但這樣時間雜度太糟了。
觀察 I1
我們可以預處理「判斷兩個人 分別站在 是否相撞」,這件事可以在 的時間複雜度解決。
有了 觀察 I1,可以發現原先的 的檢查根本可以 做出來,只需檢查任一兩個人是否相撞即可。
如果一個字元 的鍵壞掉了,則該字元在 的出現次數一定比在 的出現次數還要少,統計 跟 每個字元的數量,再比較即可。