牛客练习赛16 E

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

这题乍一看挺难的

总感觉是什么线段树

其实挺简单的

维护一个数组

代表每一个二进制位的最后出现的地方

人后从前往后扫一遍

时间复杂度

比o(n)大一个数量级

AC代码:

#include
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 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<

你可能感兴趣的:(牛客练习赛16 E)