位运算、二进制优化
文章平均质量分 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 · 1209 阅读 · 0 评论 -
2016 UESTC Training for Dynamic Programming F - 柱爷与三叉戟不得不说的故事 压位dp
压位dp dp[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 · 1226 阅读 · 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 · 1207 阅读 · 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 · 643 阅读 · 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 · 931 阅读 · 0 评论