CF165E Compatible Numbers

Jisoo

终究还是少想了一步hhh

显然如果a&b为0,那么a去掉任意数量的1(在位上)后&b还是零

所以我就想对于每一个数,枚举和&后可能的值,异或,找找存不存在

然后就挂了

看了题解才知道这种问题可以自上而下地暴力解决。

首先搞一个$inf=(1<<22)-1$,然后这个$(inf $^$ {a_i})$&$a_i$一定是为0的

然后根据这个找子集递推 ==累死。从下往上很难,那从上往下呢?

那么何不暴力一点,从$inf-0$每次$-1$,来确保枚举顺序,然后每次把当前数每一位$|1$看看有没有答案,进行递推

也就是说,有的时候除了删,还可以加,并且暴力的预处理是很有效的。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
template<class T>
void read(T &now){
    now=0;
    char c=getchar();
    int f=1;
    while((!isdigit(c))){
        if(c=='-') f=-1;
    //  cout<<isdigit(c)<<" "<<c<<" ";
        c=getchar();
    }
    while(isdigit(c)){
        now=(now<<1)+(now<<3)+c-'0';
        c=getchar();
    }
    now*=f;
}
int a[10000001];
int inf=(1<<22)-1;
int b[10000001];
int n;
int main(){
    read(n);
    for(int i=1;i<=n;++i){
        read(a[i]);
        b[inf^a[i]]=a[i];
    }
    for(int i=inf;i>=0;--i){
        if(!b[i]){
            for(int j=0;j<22;++j){
                if(b[i|(1<<j)]){
                    b[i]=b[i|(1<<j)];
                    break;
                }
            }
        }
    }
    for(int i=1;i<=n;++i){
        if(b[a[i]]) printf("%d ",b[a[i]]);
        else printf("-1 ");
    }
    return 0;
}
暂无评论

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇