Codeforces Round #765 (Div. 2)
写完ABC,又罚座了....
D. Binary Spiders
先看这个题,题意很简单,给你一堆数,让你选出一个集合,使得这个集合内任意两个数异或的值都大于等于k,最后问这个集合的最大数量以及一个构造方案。
我们考虑大于k有哪些情况,由于和位运算有关系,我们肯定要从二进制的角度去解析。我们先把k换成二进制位,我们找到它的1的最高位,那么如果一个数x要大于k的话,可以分为以下两种简单情况
1.x的1的最高位大于k的1的最高位。
2.x的1的最高位等于k的1的最高位。之后去掉最高位,再做比较。
我们先考虑第一种情况,要求这个集合内,任意两个数异或起来都是大于等于k的。第一种情况也可以换一种情况表述:将x向右移m位,m为k的1的最高位,x仍>0.也就是说,任意两个数向右移m位后,异或起来仍大于0,考虑什么情况下,两个数异或起来等于0,也就是相等的情况。那么思路就有了,我们可以把所有的数按照向右移m位后的值进行分类,不同类之间,异或起来一定大于0,则意味着情况1成立,他们互不干扰。那么同一类里面,最多能选多少个呢?考虑三个数,他们是同一类的,a,b,c,假如他们都可以被选中的话,那么在m位上他们必定ab=1,ac=1,b^c=1.那么他们中一定有两个数在m位上异或起来等于0,小于k,这说明同一类中最多选2个。至于能不能选,这就要看这一类中最大的异或值了。这是个经典问题,建个0/1 tire树即可。
总的来说这个题真挺好的。