【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 年了还要讲搜索这种东西么……感觉真的不实用了

  看看之后讲的内容咋样吧

 

转载于:https://www.cnblogs.com/scx2015noip-as-php/p/2019_7_22.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值