D. Points and Powers of Two【结论】

D. Points and Powers of Two

题意:找最长的序列,使得该序列的任意两个值的差是2的倍数. 输出长度,并输出元素

思路:

因此有结论:最长只有3,并且相邻的差只能是相同的2^k  枚举k,枚举求解最长长度

#include<bits/stdc++.h>
#define PI acos(-1.0)
#define pb push_back
#define F first
#define S second
#define debug puts
#define setp cout << fixed << setprecision(15)
#define fst ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
using namespace std;
typedef long long ll;
const int N=2e5+5;
const int MOD=998244373;
int a[N];
int ans[N];
map<int,int> mp;
int main(void){
    fst;
    int n;
    cin >> n;
    for(int i=1;i<=n;i++){
        int t;
        cin >> a[i];
        mp[a[i]]=1;
    }
    sort(a+1,a+1+n);
    int mx=0;
    int index=1;
    for(int i=1;i<=n;i++){

        for(int j=0;j<=30;j++){
            ll t= 1ll<<j;
            int cnt=0;
            ans[++cnt]=a[i];
            ll te=a[i];
//    cout <<"t="<<t<<endl;
            while(1){
//                    cout <<"~"<<te<<endl;
                if(mp[te+t]){
                    ans[++cnt]=te+t;
                    te=te+t;
                }
                else break;
                if(cnt==3)  break;
            }
//            puts("******");
            mx=max(mx,cnt);
        }
    }


    for(int i=1;i<=n;i++){

        for(int j=0;j<=30;j++){
            ll t= 1ll<<j;
            int cnt=0;
            ans[++cnt]=a[i];
            ll te=a[i];
//    cout <<"t="<<t<<endl;
            while(1){
//                    cout <<"~"<<te<<endl;
// if(a[i]==3) cout <<"te="<<te<<endl;
                if(mp[te+t]){
                    ans[++cnt]=te+t;
                                        te=te+t;
                }
                else break;
                if(mx==cnt){
                    cout << mx << endl;
                    for(int i=1;i<=cnt;i++){
                        cout << ans[i]<<" ";
                    }
                    return 0;
                }
            }
        }
    }
    cout << mx << endl;
    if(mx==1)   cout << a[1]<<endl;
//    if(mx==0)   cout << a[0]<<endl;
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值