位运算
timidcatt
永远不要放弃战斗
展开
-
D1. Candy Party (Easy Version) Codeforces Round 896 (Div. 2)
所以在只能减去一个2的幂再加上一个2的幂的情况下,只能去除x的二进制表达里面一段连续的1,所以如果某个x里面有多段1,则无法使所有相等,否则我们对于每个x,找到它最高位再高一位对应的数y,和其最低位的数z,那么如果x>0,其应该给出一个y,并获得一个z,如果x原创 2023-09-11 10:34:00 · 341 阅读 · 7 评论 -
Beautiful Sequence 2023牛客暑期多校训练营7 C
要递增,a[i]和a[i+1]的最高位要么应该相同,要么a[i]是0,a[i+1]是1,所以我们先找到a[i]和a[i+1]最高的不同位,也就相当于找sum[i]和sum[i-1]的最高不同位,如果sum[i]最高位=1,那么a[1]这一位应该是0,这样a[i+1]这一位就是1,如果sum[i]最高位=0,那么a[1]这一位应该是1,这样a[i+1]这一位就是1,而如果这一位的情况之前已经确定过了,且当前情况与之前的不符,那么就输出-1。原创 2023-08-09 14:17:02 · 163 阅读 · 0 评论 -
F. Lisa and the Martians codeforces 1851F
思路:因为ai^x使两个数不同的部分,而ai和aj都^了同一个数,所以最终结果就等于ai和ai相同的部分,也就是两个数的同或,但同或不好求,要求同或最大可以求异或最小,两个数字相距越近异或越小,相等时等于0,所以我们将原数组从小到大排序,然后找每两个相邻数异或最小值,x即为选出的数其中之一的2的k次方以内的反码,即(1原创 2023-07-27 11:36:25 · 274 阅读 · 0 评论 -
foreverlasting and fried-chicken hdu7293
思路:我们要找两个点u,v,他们至少有4个公共点,且至少有一个点的度数至少为6,其中还要判断两个点之间有没有直连的边,如果有,这个边不能放在度数的统计中,所以我们建立邻接矩阵存图,便于查找这样的边,同时用bitset将每个点连接的点记录下来,那么两个点的公共点的数量就等于两个bitset求&之后1的数量,然后再判断满足以上要求的点的度数,如果不算直连边也>=6,那么答案就加上C(它的度数,4)*C(另一个点度数,2)题目大意:给出一个n个点,m条边的图,问其中包含了几个下面这样的子图。原创 2023-07-26 16:37:54 · 112 阅读 · 0 评论 -
G. Rudolf and CodeVid-23 codeforces1846G
思路:可以发现s和一对字符串操作,就相当于s&(~e1)|e2(可以用真值表推导),因为字符串的位数最高是10位,也就是说无论怎么操作,最多出现1024个不同的字符串,所以我们可以把每个不同的字符串当做一个节点,先用bitset把字符串都转化为数字,然后每一对字符串作为边,用set来做bfs的队列,从起点开始,将set中的每个点都用上面的到的公式与每对字符串进行操作,如果到新的的距离小于之前记录的距离,就更新这个最短距离,最后队列为空后输出到0点的距离即可。原创 2023-07-11 15:52:47 · 261 阅读 · 0 评论 -
C. Interesting Sequence codeforces 1775C
思路:因为几个数连&不可能有更多的1出现在二进制表达中,所以我们的目的就是要让n中所有的1与x中的1同位置的保留,不同位置的消去,那么x中是1的位置n也必须是1,否则m不存在,然后我们发现只要将最大的不同位置为0,下一位置为1,就能实现消去这个位置以及之前所有的1,所以要想m存在,我们首先要最大的不同位置大于最小的要保留位置,同时最大的不同位置的下一位必须是0,题目大意:给出两正数n,x,要求找出一最小的整数m使n&(n+1)&...&m=x。原创 2023-01-13 17:56:11 · 210 阅读 · 0 评论 -
B. Gardener and the Array codeforces1775B
思路:我们先统计所有二进制位数出现的次数,然后再遍历每个数,如果这个数里的k个二进制位数的计数都大于等于2,则要么能用其他数凑出与这个数相等的数,例如1,2和1和2。要么这个数的二进制位数时期其他能凑出来的位数的集合的子集,例如1,2和1,2,3。题目大意:有一个由n个数组成的数组a,给出每个数有k二进制位是1,问能否找出两个不同的子序列是每个序列的或和相等。原创 2023-01-12 16:27:42 · 252 阅读 · 0 评论 -
The xor-longest Path poj3764
思路:因为异或和可以忽略重合的部分,所以两个点之间的路径的异或和就是每个点到他们的公共组先的异或和,那么我们直接从第一个节点出发dfs记录每一个点i(包括第一个点)到第一个点的异或和dx[i],然后我们只需要在所有的dx中找出异或值最大的两个点,用字典树可以做到O(n),trie[i][j]表示二进制从左到右忽略公共前缀的第i位数字是j,对于一个要查询的dx[i],我们在字典树中优先查找与每一位数相反的前缀,得到的便是最大值。边权树如上图,可得出0到各点的异或和dx为0,7,5。...原创 2022-08-25 19:36:53 · 134 阅读 · 0 评论 -
A^B mod C EOlymp - 1121
A^B mod C - Problems - Eolymp题目大意:a,b,c都是2的63次方以内的数,求a的b次方%c。思路:因为a,b很大,可能会溢出,所以要用快速乘+快速幂,快速乘的原理就是a不断的乘自身,如果b遇到奇数,再单独+一个a...原创 2022-07-14 15:25:23 · 102 阅读 · 0 评论 -
51nod_1046 A^B Mod C
https://www.51nod.com/Challenge/Problem.html#problemId=1046题目大意:a,b,c都是1e9以内的数,求a的b次方%c思路:幂运算最快的方法就是逐步完全平法,比如3的5次方就是先算3的平方,再算3的平方的平方,再单独乘一个3...原创 2022-07-14 15:15:23 · 145 阅读 · 0 评论 -
^&^ HDU - 6702
Problem - 6702题目大意:已知a,b求c使(a^c)&(b^c)最小思路:&运算是对于二进制的每一位,如果相同为1,不同为0,^是对于二进制的每一位,如果不同为1,相同为0,要使两个数&后最小,则应让他们二进制每一位都不同,所以我们可以先令c等于a,b二进制中相同的部分,即a&b,然后用c^a即可得到a与b不同的地方,c^b可得到b与a不同的地方,&后得0,最小...原创 2022-07-13 16:46:31 · 117 阅读 · 0 评论