CF165E Compatible Numbers题解
CF165E Compatible Numbers
题目描述
如果两个整数 xxx 和 yyy 的按位与运算结果为 000,即 x & y=0x\ \&\ y=0x & y=0,那么它们是兼容的。例如,90 (10110102)90\ (1011010_2)90 (10110102) 和 36 (1001002)36\ (100100_2)36 (1001002) 是兼容的,因为 10110102 & 1001002=021011010_2\ \&\ 100100_2=0_210110102 & 1001002=02,而 3 (112)3\ (11_2)3 (112) 和 6 (1102)6\ (110_2)6 (1102) 则不兼容,因为 112 & 1102=10211_2\ \&\ 110_2=10_2112 & 1102=102。
给定一个整数数组 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an。你需要判断,对于每个数组元素,是否存在数组中的其它元素跟它兼容?如果存在兼容元素,还需要输出一个满足条件的元素。
输入格式
第一行包含一个整数 nnn(1≤n≤1061 \leq n \leq 10^61≤n≤106),表示数组的元素个数。第二行包含 nnn 个用空格分隔的整数 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an(1≤ai≤4⋅1061 \leq a_{i} \leq 4 \cdot 10^61≤ai≤4⋅106),表示数组元素。数组中的数字可以重复。
输出格式
输出 nnn 个整数 ans1 ans2 … ansnans_1\ ans_2\ \ldots\ ans_nans1 ans2 … ansn。如果 aia_iai 与数组 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,…,an 中不存在任何其它元素兼容,则 ansians_iansi 等于 −1-1−1。否则 ansians_iansi 是与 aia_iai 兼容的任一数组中的元素,即满足 ai & ansi=0a_i\ \&\ ans_i=0ai & ansi=0,且 ansians_iansi 出现在数组中。
输入输出样例 #1
输入 #1
2
90 36
输出 #1
36 90
输入输出样例 #2
输入 #2
4
3 6 3 6
输出 #2
-1 -1 -1 -1
输入输出样例 #3
输入 #3
5
10 6 9 8 2
输出 #3
-1 8 2 2 8
说明/提示
由 ChatGPT 5 翻译
思路
高位前缀和即可实现题目。
代码见下
#include<bits/stdc++.h>
using namespace std;
long long n,a[1000006],f[5000006],p2[1000006],om;
int main(){
cin>>n;
om=pow(2,22)-1;
for(int i=1;i<=n;i++){
cin>>a[i];
f[a[i]]=a[i];
}
p2[0]=1;
for(int i=1;i<=22;i++){
p2[i]=p2[i-1]*2;
}
for(int i=0;i<=21;i++){
for(int j=0;j<=om;j++){
if((j&p2[i])!=0&&f[j^p2[i]]!=0){
f[j]=f[j^p2[i]];
}
}
}
for(int i=1;i<=n;i++){
if(f[om^a[i]]==0){
cout<<-1<<" ";
}
else{
cout<<f[om^a[i]]<<" ";
}
}
cout<<endl;
return 0;
}

浙公网安备 33010602011771号