Try   HackMD

[solution] 2020-2021 ICPC Northwestern European Regional Programming Contest

沒有寫的題目都是隊友寫的
CodeForces Handle: temmieowo
Email: kapoo950807@gmail.com

pA - Atomic Energy

首先,可以發現到這道題在不考慮時間複雜度的情況下可以用 DP 解決。我們令

dpi 為當查詢為
i
時的答案,
dp0=0
,可以這樣轉移,所有:
dpi=minji, jndpij+aj

這樣的時間複雜度是
O(nC)
,其中
C
為查詢的最大值,顯然無法通過此題。

性質 A1

b
1in
中,使得
aii
最小的
i
。若任意原子
c
被使用了
b
次,則改為讓
b
原子使用
c
次不會變得更差。

證明

因為

abbacc,因此
ab×cac×b

性質 A1 可知,每個非

c 的原子至多只會被選到
c1
次,因此只需預處理前
(n12)×(n1)
個 dp 值,剩下的一定會由
c
轉移。

因此對於每個查詢

ki,若他在我們預處理的範圍內,則可以直接使用;否則我們可以找到最小的一個數
x
不大於
(n12)×(n1)
,使得
kix0(modm)
,則答案為
dpx+kixm×am

這樣的時間複雜度為

O(n3+q) 的時間複雜度解決。但實際上,可以做到比這個時間複雜度更好。

性質 A2

若選擇了

b 個非
b
的原子,則必定可以從這
b
個原子找到一種取法(也就是只選一些被選擇的原子),使得該取法中重量的總和為
b
的倍數。

證明

假設有一個長度為

b 的布林陣列
z
,第
zi
項代表「是否有取法的總和
modm
i
」。

image

並令

d=[d1,d2,,db] 代表我們取的任意
b
個非
b
的原子。

若所有的

d 都能使
z0
true,則證畢。用反證法證明,假設存在一種
d
使得
z0
不為 true,則
[d1,(d1+d2)(d1+d2+db)]
(裡面的每一項都要
modb
) 都不為
0

由鴿籠原理可知

b1 個格子放
b
個數值,則必定有數值相同,假設
d1+d2+did1+d2+dj(modb)
i<j
) 的話,就代表
di+1+di+2dj0(modb)
,矛盾。

性質 A2 可知,只要選了不小於

b 個非
b
的原子,則必定可以湊出
b
的倍數,但因為
ab
的每單位重量的價值一定比所有人都還要好,所以上述提到湊成
b
的倍數的方法,應該全部都要換成
ab

在最糟的情況下

b=n,則只需要預處理
(n1)×n
個 dp 值,接著用與前面相同的作法即可。

pE - Endgame

觀察 E1

可以在

O(nlogn) 的時間內,檢查 Alice 是否能走到 Bob(或相反)。

說明

我們枚舉所有 Alice 走的位移,假設對於位移

(xi,yi),Alice 走到的新位置是
pi=(ax+xi,ay+yi)
,那我們只要檢查是否存在能夠讓
pi
走到 Bob 的位移,後面這件事情可以用二分搜達成。

根據 性質 E1,我們可以先判斷 Alice 是否能贏。否則 Alice 應該要走到一個 Bob 走不到的地方,然而 性質 E1 並不能做到這件事。

性質 E2

Bob 至多只能走到

n22+n 個座標。

證明

假設 Bob 需要走兩步,在最差的狀況中,所有可以走的位移是

1i,jn,(xi+xj,yi+yj),總共有
n2
對,但
(xi+xj,yi+yj)
(xj+xi,yj+yi)
根本就一樣,因此至多
n22
個可能。

如果只走一步,就有

n 個可能。

至多只能走到

n22+n 種不同的座標。

這代表了我們任意選棋盤上的一格,大概有

12 可以選到 Bob 走不到的點,檢查該格是否為 Bob 能走到的點可以用 性質 E1 的方法。

隨機選取

30 格就有
1(12)30
的機率可以選到 Bob 走不到的點,這個機率足夠小。若到最後仍找不到 Bob 走不到的點,就代表 Bob 獲勝,否則可以找到 Alice 走到平手的座標。

pF - Flight Collision

這道題我們將直接模擬題目的要求,這裡提醒一下題目有提到「每次相撞只會有恰好兩台無人機」,很好證明每次相撞的一定是相鄰的兩個無人機。

觀察 F1

可以在

O(1) 的時間內,計算一對無人機相撞時的時間。

說明

一對無人機

(a,b)(假設
xa<xb
)的相撞時間取即為
xbxavavb
。若
vavb
,也就是
vavb0
,那代表它們根本不會相撞。

觀察 F2

可以在

O(1) 且僅用整數的方法,比較兩對無人機相撞時間的先後。

說明

如果我們想要使用整數比較兩對無人機

(a,b)
(c,d)
(假設
xa<xb
xc<xd
)相撞時間的先後,根據 觀察 F1,代表在比較
xbxavavb
xdxcvcvd
的大小關係。

如果

vavb0
vcvd0
,畢竟它們永遠不會相撞,時間記為
inf
,可以直接使用條件判斷。

否則若

vavb>0
vcvd>0
,則:

xbxavavbxdxcvcvd(xbxa)(vcvd)(xdxc)(vavb)

這個不等式可以用整數判斷。

為了模擬題目內容,我們希望可以達到動態更新(因為無人機會相撞)找到相撞時間點最小的相鄰無人機對,這不難想到用 set 維護。

將所有相鄰無人機對墜毀的時間點放入 set,因為 性質 F2 所以 set 動態更新時間複雜度仍然是

O(nlogn)

每次都要找到墜毀時間點最小的無人機對,直到無人機全部都墜毀,或是剩下的無人機對都不會相撞。接著把它刪除,並修復 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 →

pG - Great Expectations

我們可以在原題加上兩個特技,分別為「

(t0,p0,d0)=(0,1,0)」、「
(tm+1,pm+1,dm+1)=(n,1,0)
」。

dpi,j 為「從第
i
開始(還沒完成
i
的 trick)到終點,已經用了
j
秒的 delay 的期望總時間」。顯然的,
dpm+1,=0

依照題意,可以這樣轉移:

dpi,j=pi×((ti+1ti)+dpi+1,j)+{(1pi)×min(dp0,0,(ti+1ti)+di+dpi+1,j+di)if j+dirn(1pi)×dp0,0otherwise

這樣的 dp 定義與轉移使得我們必須要從

m+1 做到
0
,但是中途卻又用到
dp0,0
,這樣的
dp
順序難道是不好的嗎?

性質 G1

x 算出來的
dp0,0
稱做
f(x)
。若
x>f(x)
,則
x
應該要變的更大;若
x<f(x)
,則
x
應該要變的更小。

證明

先說結論,

f(x) 的圖形應該要是非遞減的,而我們要找到它與
y=x
的交點。
image

讓我們拆解

f(x) 代表的遞迴式,它形如
C1+min(x,C2+min(x,))
,這裡的
Ci
是一些常數。

可以發現當

x 變大時,
f(x)
只會變大或不變;當
x
變小時,
f(x)
只會變小或不變。

有了 性質 G1,就可以二分搜這個

x,這樣就解決了這道問題。

pH - Hot Springs

陣列排序後可以這樣構造,偶數的情況要注意方向

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 →

pI - Island Tour

首先可以

O(n3) 枚舉所有可能,並在
O(n)
的時間複雜度檢查三個人是否相撞,但這樣時間雜度太糟了。

觀察 I1

我們可以預處理「判斷兩個人

a,b 分別站在
x,y
是否相撞」,這件事可以在
O(n3)
的時間複雜度解決。

有了 觀察 I1,可以發現原先的

O(n) 的檢查根本可以
O(1)
做出來,只需檢查任一兩個人是否相撞即可。

pK - Keyboardd

如果一個字元

c 的鍵壞掉了,則該字元在
s
的出現次數一定比在
t
的出現次數還要少,統計
s
t
每個字元的數量,再比較即可。