CF165E Compatible Numbers题解

CF165E Compatible Numbers

题目描述

如果两个整数 xxxyyy 的按位与运算结果为 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。你需要判断,对于每个数组元素,是否存在数组中的其它元素跟它兼容?如果存在兼容元素,还需要输出一个满足条件的元素。

输入格式

第一行包含一个整数 nnn1≤n≤1061 \leq n \leq 10^61n106),表示数组的元素个数。第二行包含 nnn 个用空格分隔的整数 a1,a2,…,ana_1,a_2,\ldots,a_na1,a2,,an1≤ai≤4⋅1061 \leq a_{i} \leq 4 \cdot 10^61ai4106),表示数组元素。数组中的数字可以重复。

输出格式

输出 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-11。否则 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; 	
}
posted @ 2026-02-06 17:09  bz02_2023f2  阅读(2)  评论(0)    收藏  举报  来源