返回顶部

随笔分类 -  位运算

摘要:D. Treelabeling 题意:给你一颗$n$个节点的树,让你给每个点赋不同值$[1,n]$,博弈,先手先选起点$u$,之后每次选相邻的点$v$,同时满足$u \oplus v\le min(u,v)$.问你如何赋值,使得先手选择并且能赢的起点最多. 题解:先看$u\oplus v\le mi 阅读全文
posted @ 2021-11-16 10:48 _Kolibri 阅读(194) 评论(0) 推荐(0)
摘要:题意:给你一个二进制数,求有多少对$(x,y)$满足图中的两个条件。 题解:对于$x+y=x\oplus y$,我们知道异或是不进位的,那么就要保证$x$和$y$的任意一位不同时为$1$,先看$x+y=n$的情况,这很容易就能算出来,关键是$x+y\le n$怎么搞,我们假设$dp[0][i]$表示 阅读全文
posted @ 2021-10-19 20:18 _Kolibri 阅读(117) 评论(0) 推荐(0)
摘要:题意:长度为$n$的序列$a$,求其子序列$b$的最长长度,使得$b[i]$&\(b[i-1]\neq 0\ \ \ 2\le i\le k\). 题解:$dp[j]$表示二进制的$j$位的最大贡献,对于每个$a[i]$,遍历它的二进制每一位$1$,那么当前状态就可以从这些$1$的位置转移过来,先找 阅读全文
posted @ 2021-10-10 20:04 _Kolibri 阅读(66) 评论(0) 推荐(0)
摘要:题意:交互题,有一组长度位$n$的数,你最多可以询问$2*n$次,每次可以询问两个位置$i$和$j$,问他们的and或or值,求数组中第$k$大的数. 题解: 对于两个数$a$和$b$,\(a\)&$b$和$a$|\(b\),不难发现$a+b$=\(a\)&\(b\)+\(a\)|\(b\).因为$ 阅读全文
posted @ 2021-09-07 23:54 _Kolibri 阅读(47) 评论(0) 推荐(0)
摘要:题意:有两个长度为$n$的序列$a$和$b$,定义$C_k=max(A_i,B_j)\ (i\ and\ j\ge k)\(,求\)\sum^{n-1}_{i=0}C_i$. 题解:暴力思路:求出所有的$C_k$,然后从$n-1$倒着维护最大值贡献给答案即可. 根据到这维护最大值这个思想,我们考虑$ 阅读全文
posted @ 2021-07-30 17:21 _Kolibri 阅读(306) 评论(0) 推荐(0)
摘要:题意:有一颗$n$个结点的树,每个点都有点权$w[i]\(,但现在并不知道点权是多少,对于条边\)(u,v)$,我们知道$w[u]\ xor\ w[v]$的值,以及每个点权的范围$l[i],r[i]$. 题解:先假设$w'[1]=0$,然后可以线性推出其他$w'[i]$的值,在推的过程中不难发现,假 阅读全文
posted @ 2021-07-29 17:23 _Kolibri 阅读(104) 评论(0) 推荐(0)
摘要:题意:对于两个数$u$和$v$,如果$u$&\(v\)=\(v\),那么就代表$u$可以走到点$u+v$,现在你可以对任意两个数进行操作,给你$q$个询问,每次问你$u$是否可以走到$v$. 题解:其实不难发现,如果$u$&\(v\)=\(v\),那么$v$一定是不大于$u$的,并且$v$对应二进制 阅读全文
posted @ 2021-03-26 19:01 _Kolibri 阅读(58) 评论(0) 推荐(0)
摘要:题意:给你节点数为$n$的树,每个节点都有自己的权值,求所有路径的上的点的权值按位与的和. 题解:题目给的数据很大,我们不能直接去找.因此我们可以枚举二进制$[1,20]$的每一位,然后再枚举所有点,看它二进制对应位置是否满足条件,之后再去dfs找$1$的连通块即可. 代码: const int N 阅读全文
posted @ 2020-12-19 13:53 _Kolibri 阅读(92) 评论(0) 推荐(0)
摘要:题意:给你一组非递减的数,你可以对两个连续的数进行异或,使其合并为一个数,问最少操作多少次使得这组数不满足非递减. 题解:首先,给出的这组数是非递减的,我们考虑二进制,对于三个连续的非递减的最高位相同的数,我们可以将后面的两个异或,那么第一个数一定比合并的数大,所以当出现三个最高位相同的数时,操作数 阅读全文
posted @ 2020-11-30 00:51 _Kolibri 阅读(99) 评论(0) 推荐(0)
摘要:题意:有一个长度为$n$的数组,进行$m$次操作,每次读入一个值$t$,如果$t=1$,则将区间$[l,r]$的数字反转,若$t=2$,则查询下标为$i$的值. 题解:树状数组的板子题,但是考察到了位运算的知识,我们对区间进行反转的时候,只需要对树状数组$c[l]$ ^ 1,\(c[r+1]\) ^ 阅读全文
posted @ 2020-10-21 19:32 _Kolibri 阅读(124) 评论(0) 推荐(0)
摘要:题意:RT 题解: \(i\ mod \ k=0\),即所有事$k$的倍数的位置都要进行异或,根据异或的性质,我们知道如果相同的异或的数个数是偶数的话,得出的结果是$0$,所以每次询问,我们判断需要进行异或的个数,如果不是奇数的话就不用求贡献,这儿还有个结论,如果我们原来有偶数的个数,然后进行一次异 阅读全文
posted @ 2020-10-12 20:48 _Kolibri 阅读(179) 评论(0) 推荐(0)
摘要:题意:给你一组数,求有多少对$(i,j)$,使得$a_$&$a_\ge a_\ xor\ a_$. 题解:对于任意两个数的二进制来说,他们的最高位要么相同要么不相同,如果相同,那么肯定是满足题目条件的,因为异或是不进位的加法,所以我们只要找到所有最高位相同的数的个数,用桶存下来,然后再对他们求个和就 阅读全文
posted @ 2020-09-25 16:24 _Kolibri 阅读(220) 评论(2) 推荐(0)
摘要:题意:给你两个正整数$x$和$y$,求两个正整数$a$,\(b\),使得$a+b=x$,$a$&$b$=\(y\),如果$a$,\(b\),输出$a\ xor \ b$,否则输出$-1$. 题解:根据位运算的基本性质,我们知道$a\ xor \ b$可以表示不进位的加法,而($a$&$b$)<<1可 阅读全文
posted @ 2020-09-24 20:26 _Kolibri 阅读(131) 评论(0) 推荐(0)
摘要:题意:给你一个数$n$,问是否能有$k$个$2$次方的数构成,若满足,输出一种合法的情况. 题解:从高到低枚举二进制的每一位,求出$n$的二进制的$1$的位置放进优先队列中,因为$2$次方最小的值是$1$,并且只能拆分不能合并,所以判断一下是否满足,然后对于$2i$,我们可以拆分成$2$和$2^\( 阅读全文
posted @ 2020-08-21 22:18 _Kolibri 阅读(129) 评论(0) 推荐(0)
摘要:题意:有$n$个数,选择某一对数使二者分别$or$和$and$得到两个新值,求操作后所有数平方和的最大值. 题解:不难发现每次操作后,两个数的二进制表示下的$1$的个数总是不变的,所以要让平方最大,那么只能使大的尽可能大,那我们就统计每个数二进制下的每一位上$1$的个数,然后每个数的位置都尽可能的分 阅读全文
posted @ 2020-07-01 01:06 _Kolibri 阅读(145) 评论(0) 推荐(0)
摘要:题意:有一个正整数$n$,从$1,2,3,...,n-1,n$中找两个数异或,使得他们的值最大. 题解:需要特判当$n=1$的情况,答案只能是$0$,然后写个几组数不难发现,一定存在两个数使得他们异或后的二进制上每一位都是$1$,直接模拟即可. 代码: #include <iostream> #in 阅读全文
posted @ 2020-06-15 20:15 _Kolibri 阅读(158) 评论(0) 推荐(0)
摘要:题意:有一个正整数$n$,要求写出所有$1$~$n$的二进制数,统计相邻的两个二进制同位置上不同数的个数. 题解:打表找规律,不难发现: ​ $00000$ ​ $00001$ ​ $00010$ ​ $00011$ ​ $00100$ ​ $00101$ ​ 当最低位时,每次都变换,由低位向高位, 阅读全文
posted @ 2020-06-10 15:16 _Kolibri 阅读(113) 评论(0) 推荐(0)
摘要:题意:给你一组数,求数组中唯一的出现次数为奇数的那个数. 题解:这题其实直接桶排一下就行了,但是最后一个点会TLE. ​ 后来了解到这题可以用位运算来解决: ​ ^(异或)运算符:用于比较两个二进制数的相应位。在执行按位异或运算时,如果两个二进制数的相应位都位1或两个二进制数的相应位都位0,则返回 阅读全文
posted @ 2020-05-17 12:35 _Kolibri 阅读(244) 评论(0) 推荐(0)
摘要:题意:给你n个数和一个底数k,每个数每次能减去k^i(i=0,1,2,....),每个k^i只能用一次,问是否能够将每个数变为0. 题解:我们将每个数转化为k进制,因为每个k^i只能用一次,所以我们统计每个位置上的cnt,若cnt>1,则需要多次用到k^i,则不满足条件. 代码: 1 #includ 阅读全文
posted @ 2020-04-27 14:39 _Kolibri 阅读(174) 评论(0) 推荐(0)