(看前警告:这是一篇超详细+超麻烦的代码,能自己写的不要看,应该没你的方法好。)
题意简述
总共有 2k2^k2k 种动物,编号 0∼2k−10 \sim 2^k-10∼2k−1。
有 mmm 条规则:只要动物园里面存在动物编号第 ppp 位为 111,就必须购买饲料 qqq。现在已经养了 nnn 只动物,饲料清单已经确定。
一只新动物 xxx 可以被添加的条件:加入 xxx 不会增加任何需要买的饲料。
求还可以新增多少种动物。
思路分析
have_ bit[p]:现有的动物中是否存在某只动物二进制第 ppp 位是 111
has_rule[p]:第 ppp 位有没有绑定饲料(该位为 111 需要买饲料)
一个二进制位 ppp 是自由位,满足下面任意一条即可:
该位没有饲料约束,可以随便填 0/10/10/1
该位虽然有饲料约束,但是已经被现有动物激活 havebit[p]=truehave_bit[p]=truehaveb it[p]=true,新动物这一位填 111 也不会多出饲料
合法动物总数量:2自由位个数2^{\text{自由位个数}}2自由位个数
答案 = 合法总数 − 当前已经有的动物 nnn
坑点详解
kkk 最大等于 646464,2642^{64}264 超出 unsigned long long 的范围
freebit=64free_bit = 64freeb it=64 并且 n=0n=0n=0:直接输出字符串 18446744073709551616
freebit=64free_bit = 64freeb it=64 并且 n>0n>0n>0:使用 ULLONG_MAX - n + 1
动物编号最大可以是 264−12^{64}-1264−1,读入变量必须用 unsigned long long
n,m≤106n,m \le 10^6n,m≤106,一定要开输入加速,否则超时
( 当然了,我自己都没写)
复杂度 O(nk+m+k)O(nk+m+k)O(nk+m+k),k≤64k \le 64k≤64
读到这先别看了,自己再去看看题,写一写吧
肥美无敌代码展示
你应该也不需要了吧
(终于会用 美元符号写题解了美元符号写题解了美元符号写题解了 hhh 写这种变量名的代码在我的写的题里面不多见( 保持神秘保持神秘保持神秘))