热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

codeforces:D.Tricksofbitwiseoperators'and'and'or'insquaresum

分析x和y变成x|y,x&y他们的和不变的,然后我们直到这样变只会让他们的差放大,放大的话平方和肯定更大对于n个元素而言,多次and和o

在这里插入图片描述

分析

x和y变成x|y , x&y
他们的和不变的,然后我们直到这样变只会让他们的差放大,放大的话平方和肯定更大
对于n个元素而言,多次and和or并不会改变每个位上的1的总数,我们先把每个位置的1的个数统计出来
然后我们只需要贪心地把每个位置的1都往一处堆,这样的话差就会最大

ac code

import sys
from collections import defaultdict
input = sys.stdin.readlinen = int(input())
a = list(map(int, input().split()))counter = defaultdict(int)for aa in a:aa = bin(aa)[2:].zfill(20)for i in range(20):if aa[i] == '1':counter[i] += 1ans = 0
for i in range(n):tempNum &#61; 0for j in range(20):if counter[j] > 0:tempNum &#43;&#61; 1 << (19 - j)counter[j] -&#61; 1ans &#43;&#61; tempNum ** 2print(ans)

总结

位运算中的不变量
and和or的诡计
同一个位上的1的总数保持不变


推荐阅读
author-avatar
歼鸡队队长_512
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有