【2019.7.22】开关灯 / 翻煎饼 / 智破连环阵
我并不在 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 年了还要讲搜索这种东西么……感觉真的不实用了
看看之后讲的内容咋样吧