牛客练习赛16 D 思维

https://www.nowcoder.com/acm/contest/84/D

这道题是这场比赛的防AK题

这道题乍一看挺难

其实打表找了找规律

有带上小学时候学奥赛的一个定理

然后大胆猜了个结论

之后不知道怎么维护不超时

然后问了陈尊龙

果然厉害

秒出答案

然后我把题切了

至于怎么做的

看代码来理解吧

这里我就不解释了

AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int A[N];
int B[35];
struct P{
    int a,b;
}C[35];
bool cmp(P x,P y){
    return x.a>y.a;
}
int main(){
    int n;
    cin>>n;
    set<int> S;
    for(int i=1;i<=n;++i){
        cin>>A[i];
        S.insert(A[i]);
    }
    for(int i=1;i<=n;++i){
        int a=A[i],b=0;
        while(a){
            if(a%2==1) B[b]=i;
            ++b;
            a/=2;
        }
        for(int i=0;i<=30;++i)
            C[i].a=B[i],C[i].b=i;
        sort(C,C+30+1,cmp);
        int c=0;
        int d=0;
        while(d<=30){
            while(d<30&&C[d+1].a==C[d].a){
                c|=(1<<C[d].b);
                ++d;
            }
            c|=(1<<C[d].b);
            ++d;
            S.insert(c);
        }
    }
    cout<<S.size()<<endl;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值