我並不在 ssf 參加集訓,而是在距離 ssf 近兩千公里之外的廣州口胡 ssf 的集訓題
好吧其實並沒認真看題,老年退役選手干點啥修仙事情不好?
沒注明的部分都是收到課件前口胡的
T1
題意
$n$ 盞燈,由 $m$ 條邊連接。每個燈有開關兩種狀態,一次操作可以將一盞燈及所有與其直接連邊的燈的開關狀態反轉。一開始所有的燈都關着,求至少需要多少次操作使所有燈亮。
$n\le 36$
題解
這是簽到題吧,估計集訓現場全切了
這數據范圍不是 meet in the middle 的標准數據范圍🐎
首先每個燈只能操作 $0$ 或 $1$ 次,因為操作 $2$ 次等價於操作 $0$ 次。那么 $n$ 盞燈就有 $2^n$ 種操作情況。
然后我們將 $n$ 個點均勻分成兩塊,對每塊暴力枚舉 $2^{\frac{2}{n}}$ 操作情況。
對於每種操作情況,給每個點記一個 $n$ 位的二進制數 $f_i$。若當前枚舉的操作情況中 沒有操作這盞燈,$f_i$ 就是 $0$;若操作了這盞燈,就把操作這盞燈所影響的所有燈的編號對應的二進制位置為 $1$(其實就是把所有燈狀壓了)。
然后把一塊內所有 $f_i$ 都 xor 起來,就得到了當前枚舉的操作情況 打開了所有 $n$ 盞燈中的哪些燈(二進制數的第 $i$ 位為 $1$,則編號為 $i$ 的燈亮了,否則編號為 $i$ 的燈滅了)。把這個二進制數用 hash 表存起來。
然后爆搜另一塊的操作情況時,對於每種操作情況得到的二進制數,在 $hash$ 表里查它的互補值是否存在,若存在則找到了一組解,更新答案即可。
互補值就是把每一個二進制位取反得到的二進制數
這樣做的道理也很顯然,就是恰好不動那些已經被另一塊開的燈,然后讓這一塊把其余所有關着的燈打開。
之前弱智了,想了半天 $\frac{2}{n}$ 位狀壓的做法,后來才發現我只是記個哈希值,又不是開 $2^{\frac{2}{n}}$ 位數組,開個 $longlong$ 不就行了。好sb啊
T2
題意
給你一個 $1$ 到 $n$ 的排列,一次操作可以將某個前綴區間翻轉,求至少需要多少次操作才能將序列變成單調上升序列。
$n\le 20$
題解
這個我好像只會模擬退火啊,我太蔡了
回公寓看了課件后差點噴了
第一種做法怎么隨便剪個枝就過了啊?優化程度這么大嗎?那其它爆搜題是不是隨便寫個剪枝也飛跑了
第二種做法好像更不能理解啊,操作步數不是可以超過 $n$ 么?迭代個 $20$ 多步不應該 T 飛了🐎
わからない
T3
題解
怕不是個瞎做題
假設消滅了前 $i-1$ 個武器,枚舉 $j$,求第 $i$ 到 $j$ 個武器的最小圓覆蓋大小是否超過炸彈范圍,在不超過炸彈范圍的條件下找到最大的 $j$,然后炸掉第 $i$ 到 $j$ 個武器,從第 $j+1$ 個繼續往后炸即可。
我沒驗證復雜度,但這樣應該能過吧,萬一錯了不要噴我……反正對於一個 $i$ 找最大的 $j$ 相當於跑一次最小圓覆蓋,這個時間復雜度是 $O(n)$ 的,有興趣的可以移步luogu最小圓覆蓋模板。
抱歉,看錯題了……原來是給定了 $n$ 個炸彈的坐標,讓你確定這些炸彈的引爆順序
貌似只會 $O(n^3)$ 暴力加點剪枝啊,應該能過吧(霧)
這道題題解的后兩頁是什么意思……
后記
都 9102 年了還要講搜索這種東西么……感覺真的不實用了
看看之后講的內容咋樣吧