CF 379 Div2 F题

 这一题思维要求较高,代码要求较低,而我要重点提高思维强度。

给出n(1e5)和数组b和数组c,要求出一个数组a,满足bi=sigma(ai and aj),ci=sigma(ai or aj)。

题意很简洁,但是看起来好像很难入手。

这种位操作的题目一般都要考虑分位,把大问题简化成一位的小问题来处理,这样可以方便思考。

我发现了ci-bi=sigma(ai xor aj),这点是好的,但是好像并没有什么卵用。

要发现ci+bi=sigma(ai + aj)才是解题的关键,即ai and aj + ai or aj = ai + aj,用集合论可以较为形象地显示出来,如果不行,先考虑0和1的情况,因为这种情况下是满足a and b + a or b=a + b的,所以任何的情况都满足的。有了这个性质,一切都好说了。

令di=ci+bi,那么di=nai+sigma(aj),那么sigma(di)=2*n*sigma(aj),令sd=sigma(di),sa=sigma(aj),然后每一个ai都能够相应地求出来,并且是唯一的,最后再检测每一个bi和ci是否满足题目要求即可。

技巧:先根据某一个必要性条件找出唯一的可能解,再检测。最关键的是等式a and b + a or b = a + b,形象地理解是a有b无和b有a无的都加到a or b那里了,还有a有b有的加了一次在a or b那里,省下一次的a有b有就加在a and b那里,总的来说这个性质还是挺显然的,所以还是得想到的。

posted @ 2016-12-20 12:01  fjhok  阅读(166)  评论(0编辑  收藏  举报