zoukankan      html  css  js  c++  java
  • hdu 2014 位运算

    /*
    注意两点
    1.从后往前找互补的,刚开始我找的是相邻的但是这个例子就不行101 110
    2.因为时累加所以sum可能会超出int范围,这个很重要。
    */
    #include<stdio.h>
    #define N  110000
    #include<string.h>
    int a[N];
    int vis[N];
    int power(int u) {
     int k=0;
     while(u) {
        u/=2;
        k++;
     }
     return k;
    }
    int main() {
       int n,i,aa,bb;
       __int64 sum;
       while(scanf("%d",&n)!=EOF) {
          for(i=1;i<=n+1;i++)
            scanf("%d",&a[i]);
            memset(vis,0,sizeof(vis));
            sum=0;
            for(i=n;i>=0;i--) {
                if(vis[i])continue;
                aa=(1<<power(i))-1;
                bb=aa^i;
               // printf("%d %d
    ",aa,bb);
                vis[bb]=i;
                vis[i]=bb;
                sum=sum+(__int64)aa*2;
            }
            printf("%I64d
    ",sum);
            printf("%d",vis[a[1]]);
            for(i=2;i<=n+1;i++)
                printf(" %d",vis[a[i]]);
            printf("
    ");
       }
    return 0;}
    

  • 相关阅读:
    lc739
    POJ3280
    6.2
    5.30
    5.28
    5.26
    5.26
    5.25
    从0搭建vue项目
    docker安装jenkins并使用
  • 原文地址:https://www.cnblogs.com/thefirstfeeling/p/4410608.html
Copyright © 2011-2022 走看看