ad-hoc 精選集

Arghariza發表於2024-10-18

校內講題。

傳統

Sheriruth

一個連通塊如果連不了邊,那麼一定形如 一棵內向樹 或者 一棵內向基環樹。前者只需要判斷祖先關係,後者需要討論是否在環上。

否則考慮一個點 \(u\) 如果有多條出邊 \((u,v_1),(u,v_2),\cdots,(u,v_m)\),那麼 \(v_1,v_2,\cdots,v_m\) 會互相連邊形成一個團(無向完全子圖),並且此時 \(v_i\) 能到的所有點也會被合併到這個團中。

於是最後連通塊一定形如一個團和若干棵內向樹,其中每棵內向樹的根連向團中的某些點。大小為 \(s\) 的團上相異兩點 \(u,v\) 的路徑條數為 \(\sum_i(s-2)^{\underline i}\),於是直接做就行了。注意特判如果 \(u\) 直接走到團上的 \(v\) 的情況。

構造

沒有改了的。

互動

World Ender

題解 markdown 流失了,看官方 beamer 的題解吧,大概是一樣的。

通訊

Broken Device

考慮相鄰兩位一組,用三進製表示 \(X\),每組有損壞/0/1/2 四種情況。那麼損壞對應 \(00\)\(0,1,2\) 對應 \(01,10,11\)。這樣構造能取到的上界為 \(3^{150/2-40}\) 大概是 \(5\times 10^{16}\)

然後把所有位隨機打亂一下,這樣的話損壞的組的期望就會減少,期望上界會到 \(10^{19}\)。具體打亂做法就是讓 AnnaBruno 共用一個隨機種子,這樣隨機打亂的結果是相同的。

考慮把損壞的段也利用起來,如果有一段是 \(\mathtt{X\_}\),那麼可以填入 \(01\);如果是 \(\mathtt{\_X}\),可以填入 \(10\)。這樣就能過了。

因為是隨機打亂的,所以很難構造資料卡掉。

Message

參考了 u 群裡面的做法,這個做法不用關心資料包被纂改的情況。

首先肯定不能傳一個長度 \(S\) 的資訊,因為如果 \(S=1024\) 的話你至少要 \(1024+31=66\times 16-1\) 個 bit 來傳輸訊息和可能被纂改的位置的資訊,這樣你要在 \(1\) bit 之內傳入長度,這太難了。

所以可以先把 \(S\) 末尾加上形如 \(0111\cdots\),形成長度為 \(1025\) 的二進位制串 \(S'\),這樣的話我們把 \(S'\) 還原出來然後把最後一個 \(0\) 以及後面的位全刪掉就行了。

然後考慮如何使用 \(31\) 個 bit 來傳輸 \(31\) 位中哪些位是可能被纂改的。

我們把所有不會被纂改的位,也就是所有 \(C_i=0\)\(i\) 拿出來,從小到大記為 \(p_0,p_1,\cdots,p_{15}\)

注意到 \(16>\frac{1}{2}\cdot 31\),所以可以構造一個唯一的最大值:具體地,如果我們將 \(p_i\)\(p_{(i+1)\ \bmod\ 15}\) 連有向邊,那麼無論其餘 \(\{0,1,\cdots,31\}\setminus \{p_0,p_1,\cdots,p_{15}\}\) 中任意一個位置如何連出一條邊,這個圖都會構成一個內向基環樹。而 \(p_0,p_1,\cdots,p_{15}\) 為這個基環樹的唯一最大環

那麼我們只需要考慮如何傳輸連邊的資訊:對於任意的 \(C_i=0\),記錄 \(d_i=(p_{(i+1)\ \bmod 15}-p_i) \bmod 31\),我們在前 \(d_i-1\) 個資料包的第 \(i\) 位傳 \(0\),在第 \(d_i\) 個資料包的第 \(i\) 位傳 \(1\)。然後接收的時候就只需要對每一位 \(i\) 算出第一個 \(1\) 的位置 \(d'_i\),然後 \(i\)\((i+d'_i)\bmod 31\) 連邊就行了。這樣的話 \(C_i=0\) 的位連的邊一定是對的,\(C_i=1\) 的位連的邊可以任意。找到最大環就找到了所有 \(C_i=0\) 的位。

然後我們把 \(S'\)\(1025\) 個 bit 塞進所有 \(C_i=0\) 的位的剩餘沒用到的位置即可。

(Un)labeled graphs

只需要還原點的編號即可得到整個圖。

新建一條長度為 \(\log n\) 的鏈來表示編號的二進位制,然後我們考慮如何確定鏈的方向,以及如何區分出這條鏈。

設多出來的點為點 \(A,B,C\)。點 \(A\) 向鏈上的所有點連邊;點 \(B\) 連向 \(A\) 和鏈首(也就是代表第 \(0\) 位的點);然後將點 \(C\) 連向除了點 \(A\) 之外的所有點。

這樣的話,找到度數最大的點就是點 \(C\);唯一不與 \(C\) 相連的就是點 \(A\);與 \(A\) 相連的所有點就是點 \(B\) 和整條鏈;唯一與 \(A,C\) 相連且度數恰好為 \(3\) 的點為點 \(B\)

可能有些特殊情況需要處理,但這是簡單的。

8 染色

首先進行黑白 \(2\) 種顏色是簡單的,於是不難想到每個點傳 \(2\) 個 bit,表示顏色在二進位制下的前兩位。這樣就可以做 \(L=4\times 10^5\)

考慮所有度數 \(<8\) 的點,它們的顏色都可以用周圍點的顏色排除出來。於是我們只需要傳度數 \(\ge 8\) 的點的 bit,然後求出這些點的顏色後再拓撲出其餘點的顏色即可。

由於 \(\sum_i d_i=2m\),於是 \(2\sum_i[d_i\ge 8]\le \frac{m}{2}\le 2.5\times 10^5\)。於是就做完了。

卡常。

相關文章