Codeforces Round 843 B题题解
Codeforces Round 843 B题题意:
记$ f(a)$ 是 $a$ 数组中,所有数的按位或。
现有 $n$ 个数 $c_1,c_2…c_n $组成的数组,询问是否有两个不同的子数组 $a和b$,使得 $f(a)=f(b)$。
分析:
考虑下述方法:
选择$a=c,b$是$c$中去掉某个元素形成的数组。
例如样例
1234543 1 2 42 2 44 1 2 5 62 2 5
$a$ 选取所有的数,所以 $a$ 在 $1,2,4,5,6$ 位上都表现为 1 $, b$ 去除了最后一个数,其按位或一致。
判别方法如下:
对于每一个位,统计它在这 n 个数中的出现次数。
如果去除某个数之后,出现次数大于等于 1 的位的集合不变,则可行。
例如在上面的策略中,每个数的出现次数为:$ \{1:2;2:4;4:2;5:2;6:1\}$ ,去除了最后一个数则是 $\{1:2;2:3;4:2;5:1;6:1\}$ ,满足要求。
我们可以证明任意的方案都可以转化为这一类方案。假设某种 $a≠b$ 方案符合要求,则通过以下方法可以转化:
假设此时$ a 不是 b $的子集,如果 ...
Codeforces Round 843 C题题解
Codeforces Round 843 C题
题意:本题是给定n和x,试求是否存在m>=n,满足n & (n+1) & … & m=x
12345678910111213141516171819202122232425262728293031323334353637383940414243444546#include<iostream>#include<vector>#include<set>#include<bitset>using namespace std;typedef long long ll;#define endl '\n'void solve(){ ll n, x; cin >> n >> x; bitset<64> b1(n), b2(x); ll l = n, r = 5e18, fuck = n; for (int i = 63; i >= 0; i--) //要注意bitset是逆序输出的 { if ...