1 solutions
-
0
D
算法 1
对于每个询问暴力枚举一个二进制数判断一下是否匹配,时间复杂度 ,期望得分 。
如果只枚举每个问号填什么还可以通过 ,期望得分 。
如果 ,可以加个记忆化,时间复杂度 或 ,据实现优秀程度可以通过 中前缀的测试点,期望得分 。感觉能过 的话是真很会写代码了。
这里讲一下怎么分析这种暴力的时间复杂度。首先如果你的做法是暴力枚举二进制数,那没什么好分析的,不同询问个数是 ,每个询问 ,总共就是 。如果你是枚举问号,可以分析每一位有哪些可能:如果询问的是 的话,查询的时候不用枚举这一位,否则相当于枚举了
?0和?1两种,也就是说每一位有 中情况,时间复杂度就是 。再举个例子,如果给定数组 ,求 (即求子集和),如果使用暴力的话,每一位有三种情况:s0t0,s1t1,s1t0,所以暴力时间复杂度 。算法 2
可以考虑魔改高维前缀和。设 dp 状态: 表示我们考虑了前 位 , 表示前 位对应的
01?, 表示后 位对应的01的权值和。考虑人话说法:如果一个权值 满足:前 位和 符合,后 位等于 ,就会把 加入 。
例如 时:,。
考虑转移, 的时候用手枚举一下 的第一位是保持不变还是变成问号,把这一位塞到 里,再把 的第一位扔掉。初始化是 。查询答案是 。
可以发现转移是 的,状态数是 。如果你不会分析或者不想分析,可以认为是 。实际上可以分析:$\sum_{i=0}^n 3^i2^{n-i}=\sum_{i=0}^n 3^{n-i}2^i=3^n\sum_{i=0}^n(\frac{2}{3})^i\le 3^{n+1}$,所以其实是 。空间也是 。期望得分据实现优秀程度 (不结合 的暴力)。
算法 3
我会特殊性质!
对于 ,相当于算所有填充方案对应二进制数和。可以独立计算每一位的贡献。时间复杂度 ,期望得分 。
询问的
?至少有 个,我也不太懂咋做,反正你枚举那四个不是?的预处理一下反正能做到 ,估计也没人会写就是了。如果放到算法 2 的写法里要求 至少 个问号好像好写一点。询问不存在
1,直接套用前面魔改高维前缀和的思路,由于 的状态数变成了 ,复杂度就是 。期望得分 。这部分对正解很重要!!!结合前面所有做法期望得分 (咋这么高来着)。
算法 4
正解有点难。
询问不存在
1的特殊性质启发我们对1进行容斥。考虑只有 个1的情况,不妨记为1...。可以发现这个等价于?...的答案减掉0...的答案。进一步考虑只有 个1的情况,不妨记为11..,可以发现这个等价于??..减掉?0..减掉0?..加上00..。用容斥的话讲就是:枚举一个
1的子集 ,钦定这一个子集必须不是1,即必须是0;剩下的1的位置没有限制,相当于?。可以把1理解成一个限制,也是容斥的对象。枚举一个子集要求不合法,剩下的没有限制。容斥系数是 。时间复杂度是 ,其中 是1的个数。同时需要预处理全是0?的串的答案,高维前缀和即可。记
0,1,?的个数为 。注意到我们对称的有了 和 的做法,暴力是 的,而 ,所以选一个最小的跑暴力,时间复杂度 。空间复杂度 。卡空间是因为原题卡了,不太懂。
Information
- ID
- 2824
- Time
- 1000ms
- Memory
- 256MiB
- Difficulty
- 10
- Tags
- (None)
- # Submissions
- 3
- Accepted
- 0
- Uploaded By