![](https://img-blog.csdnimg.cn/20201014180756738.png?x-oss-process=image/resize,m_fixed,h_64,w_64)
位运算、二进制优化
文章平均质量分 92
ProLightsfxjh
这个作者很懒,什么都没留下…
展开
-
Codeforces Round #371 (Div. 2) C. Sonya and Queries 压位、二进制来状态压缩
压位、二进制来状态压缩根据 ai的各个digit的奇偶可以把它状态压缩到一个 Ind比如 Ind = 0;然后最右边以为是 奇数 则 Ind += pow2[0];如果是 右边第二位是奇数则 再 Ind += pow2[1]如果是偶数则先对应的二进制是0,所以不要 更新 Ind这样 对于 每个 ai 都唯一对应一个 Ind而且 ai < 1e18, 所以最多18个二进制位就可以存放所有状态, Ind <= 2^18; 1、'+' 的时候, ans[Ind]++;2、‘-’ 的时候, an原创 2016-09-16 03:18:32 · 1204 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
压位dpdp[i] 表示状态为i是的最小消费, 状态i则是i的二进制表示以后哪些地方是1表示有已经获得了哪些元素Ind = 1<<0, 表示有元素 1;Ind = 1<<15 表示有元素 15;Ind = 0;Ind += 1<<0;]Ind += 1<<15;然后Ind 表示有元素 1 、15;然后有十五个元素, 所以最多1<<15, 设为 maxi = (1<<15) + 2;然后 for(int i = 0; i < maxi; i++){ for(int j =原创 2016-05-17 11:48:31 · 1220 阅读 · 0 评论 -
Codeforces Round #367 (Div. 2) D. Vasiliy's Multiset 二进制树、Trie
二进制树、Trie用一个二进制树(字典树的一种特殊化)来储存child[x][k] 表示以x为父节点, k 为边, 的子节点sz[x]表示这个节点的值, 值为0的时候节点不存在查询的时候, 从根开始走, 尽量去走 和 val 的当前二进制为不相等的节点, 此时的二进制异或为 1 , k = ((val >> i) & 1) ^ 1, res ^= 1 << i; 如果没有再走二进制为相等的节点 if(!sz[chil原创 2016-09-09 02:17:36 · 1202 阅读 · 0 评论 -
Codeforces Round #365 (Div. 2) D. Mishka and Interesting sum 离线操作,树状数组,last[value],异或和
离线操作,树状数组,last[value],异或和首先,根据位异或的性质, 有一个结论:区间内所有出现次数为偶数的元素的异或和 == (区间内所有元素的异或和) ^ (区间内所有不同元素的异或和) 1、对于求 (区间内所有元素的异或和) 可以用 前缀异或和 2、对于(区间内所有不同元素的异或和), 则要用类似于求 区间不同的元素的个数 的算法 2016 UESTC Training for Data Structures K - 郭大侠与甲铁城 树状数组+离线操作先把所有询问储存下来, 然后原创 2016-09-16 23:17:16 · 640 阅读 · 0 评论 -
Gym - 101102J J. Divisible Numbers 位运算+优化+前缀和
题意:给出n个数,然后每次询问l r s,表示在lr区间内有多少个x,是x能被集合s里的至少一个元素整除,s表示一个{1~10}的子集位运算+优化+前缀和可以预处理出前缀和 sum[i][j]表示1~j中能被集合i满足的数的个数,且i为奇数时比有元素1,lr区间内所有的数必定可以被1整除,所以只剩下512中情况故 int sum[512][maxn];读入的时候每次判断v可以被哪些数整除,然后得到集合s,s说表示的集合中所有的元素皆可以整除v,然后用这个s和0~512位于返回非0值则有公共元素,原创 2017-01-14 21:53:10 · 928 阅读 · 0 评论