hehezhou will win ioi2022
zhoukangyang · · 题解
场上题目看错两次,day2 成功爆炸 /ll
验体读阅的好更
本文下标从 1 开始
算法 1
我会容斥!
先把问题转化成统计不存在一个合法位置的方案数。
接着统计有钦定
在一次机器人的操作后,所有输入的数在经过机器人在操作后的输出都可以表示成
考虑一个纸带:对于一个被钦定的每一个位置,要求输入经过这个机器人操作之后一定等于输出。仍然把输出表示成输入的形式,只不过这个输出可以以多种方式被输入表达。
对于每一个位置分类讨论:
- 如果这个位置上表示成的结果
既有 0 又有 1或既有 x 又有 1-x:输入输出都为空。方案数为1 。 - 如果不满足条件
1 ,这个位置上表示成的结果有 0 或 1且有 x 或 1-x:输入输出都为空,否则输入输出就被固定了。方案数为2 。 - 条件 1,2 都不满足:对于每一个输入都对应一个唯一的输出,方案数为
3 。
这个纸带上每一个位置就是独立的了,最后把每个位置的答案乘起来即可。
注意机器人爆炸的情况。
时间复杂度
code
算法 2
我会优化算法1!
对于第 R 的个数个(设为
考虑枚举最后一个钦定的位置在哪里(设为
然后对于前
但我们发现并不是所有元素都需要记录下来的:只用记录与当前位置距离不超过
最后再处理一下位置超过
时间复杂度
code
算法 3
我会 bitset!
发现我们统计一个位置的贡献的时候,只有 是否有... 有用。所以考虑用 0,1,x 和 1-x。
这样复杂度就降到了
其实我们要求的是类似于一个子集中的 f[x] = f[x & -x] | f[x ^ (x & -x)]。
时间复杂度
code
感觉讲的有些抽象,不过相信大家想到算法2 之后就会做了。
祝大家学习愉快!