首页 > 毒瘤xor
头像 包子超好吃
发表于 2021-01-16 10:45:11
//笱蒻一枚,有问题请指正/题目核心是考虑到位运算,每个数据都是int型,那么每个数字都可以看作32位的二进制串; 题目要求出异或最优解,什么是异或?例如:10111010100111异或结果为:111010;所以这道题我们把32位二进制前31位,每一位的1的个数统计出来,如果个数大于0的个数那么这 展开全文
头像 铁厂打工人
发表于 2021-01-15 20:29:41
毒瘤xor 解题思路用前缀和预处理31位二进制数每一位1的个数,区间[L, R]上每一位如果1的个数多于0的个数,X对应二进制位上值为0,否则为1注意若有多组可行解,需要输出较小的解,则当0和1个数一样时,X对应二进制位上取0 AC代码 #include <iostream> usi 展开全文
头像 东溪看水
发表于 2020-07-04 11:39:24
题目 有 个数 ,给出 个询问,每次询问给出区间 ,现在请找到一个数 ,使得 最大, 表示异或操作。 解题思路 要使条件 2 成立,需要求出区间 中,所有数值的二进制表示的 31 位,每位 1 的个数。如果某位 0 的个数大于 1 的个数,那么所求 在该位上取 1,否则取 0。 计算 展开全文
头像 威风镰鼬
发表于 2021-06-12 13:39:53
思路 可以用位运算和前缀和的相关知识。要让X异或a[i]求和最大SUM,则SUM的每一位都是1,我们需要求的是X的每一位该取0还是1。我们可以用一个二维数组a[i][j]记录前i个数第j位是1的个数,这样我们就能知道L~R范围内某一位的0多还是1多。运用异或的性质我们知道,在0多的情况下X那一位该取 展开全文
头像 吃花椒的妙酱
发表于 2021-01-19 20:46:52
//毒瘤xor #include <bits/stdc++.h> using namespace std; typedef long long ll; int arr[100005][34]; int b[34]; int main() { int i,n,j,t; 展开全文
头像 horz
发表于 2020-07-02 18:26:07
题意 有一个长度为的数组,每次询问一个区间,找一个,使得最大。 分析 我们考虑每一位,假设我们区间的长度为,有个数在这位上是,三个数是,那么的这一位选的贡献会更大,因为异或之后这一位就会有个,个。 所以我们可以根据区间的每一位的的个数来决定的这一位的取值。 具体一点就是: 多放,多放,一样多放。 # 展开全文
头像 微澜尛雨
发表于 2021-11-25 12:26:19
题目考点:前缀和、位运算 题目大意:找到一个数X,使得X和数列区间内所有数字异或后,得到的值最大。 题目分析:暴力解法O(d * 2e10),其中d为区间长度、2e10为int正整数范围,用派蒙的脑子想想就知道不可取吧?换个想法来看,统计一下区间内的数字的第i位0的个数和1的个数: 若第i位1的个数 展开全文
头像 QingShan0
发表于 2024-02-17 19:52:12
前缀和和位运算的基本运用。另外还有贪心的思想。 关于位运算上的数什么时候取1,这取决于当前区间上的数中该位置是1多还是0多。 因为多组解要求最小的,所以只有当1的个数严格<总个数的一半的时候,X的这一位才取1。 没有必要给中间值开double,直接让前面乘以2即可。 #include<i 展开全文
头像 美丽雯雯
发表于 2023-02-03 10:18:17
要求使得a【l】到a【r】的和异或上x的值最大的x,要求出这样的x,就要求出使得结果中的1最多的x。 任何数异或0为它本身,异或1取反,因此,当a【l】到a【r】的二进制的某一位中1的个数较多时,x的这一位取0,反之取1。 知道了这个规则,我们只要计算出二进制的每一位中1或0的个数,就可以知道x的这 展开全文
头像 谢天意
发表于 2021-04-09 10:58:11
给定一个长度为n的序列,有m次操作,每次有一个l到r的区间,找出x使得l到r区间内的数异或x的和最大思路 这种位运算的题基本都是考虑二进制来做,对区间操作,可以想到对点操作,也就是前缀和考虑对于每一位,是选1好还是选0好 #include<iostream> using namespac 展开全文