zoukankan      html  css  js  c++  java
  • Number Sequence HDU

    There is a special number sequence which has n+1 integers. For each number in sequence, we have two rules:

    ● a i ∈ 0,n0,n
    ● a i ≠ a j( i ≠ j )

    For sequence a and sequence b, the integrating degree t is defined as follows(“�” denotes exclusive or):

    t = (a 0 � b 0) + (a 1 � b 1) +・・・+ (a n � b n)

    (sequence B should also satisfy the rules described above)

    Now give you a number n and the sequence a. You should calculate the maximum integrating degree t and print the sequence b.
    Input
    There are multiple test cases. Please process till EOF.

    For each case, the first line contains an integer n(1 ≤ n ≤ 10 5), The second line contains a 0,a 1,a 2,…,a n.
    Output
    For each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b 0,b 1,b 2,…,b n. There is exactly one space between b i and b i+1 (0 ≤ i ≤ n - 1). Don’t ouput any spaces after b n.
    Sample Input
    4
    2 0 1 4 3
    Sample Output
    20
    1 0 2 3 4

    #include<map>
    #include<set>
    #include<queue>
    #include<stack>
    #include<vector>
    #include<math.h>
    #include<cstdio>
    #include<sstream>
    #include<numeric>//STL数值算法头文件
    #include<stdlib.h>
    #include <ctype.h>
    #include<string.h>
    #include<iostream>
    #include<algorithm>
    #include<functional>//模板类头文件
    using namespace std;
    
    typedef long long ll;
    const int maxn=110000;
    const int INF=0x3f3f3f3f;
    
    ll a[maxn];
    ll d[maxn];
    int main()
    {
        ll n;
        while(~scanf("%I64d",&n))
        {
            for(ll i=0; i<=n; i++)
                scanf("%I64d",&a[i]);
            memset(d,-1,sizeof(d));
            ll ans=0;
            for(ll i=n; i>=0; i--)
            {
                ll t=0;
                if(d[i]==-1)
                {
                    for(ll j=0;; j++)
                    {
                        if(!(i&(1<<j)))  t+=(1<<j);
                        if(t>=i)
                        {
                            t-=(1<<j);
                            break;
                        }
                    }
                    ans+=(i^t)*2;
                    d[i]=t;
                    d[t]=i;
                }
            }
            printf("%I64d
    ",ans);
            for(ll i=0; i<=n; i++)
                printf(i==n?"%I64d
    ":"%I64d ",d[a[i]]);
        }
        return 0;
    }
    
  • 相关阅读:
    2016某天闲谈
    APP测试入门篇之APP基础知识(001)
    windows服务器下frp实现内网穿透
    nginx使用与配置
    spring boot 实现优雅的关闭
    spring boot 自定义sql分页查询
    java获取类加载路径和项目根路径的5种方法
    linux下 启动node 和关闭node
    docker 安装 fastdfs
    docker 常用命令和常用容器启动
  • 原文地址:https://www.cnblogs.com/nyist-xsk/p/7264824.html
Copyright © 2011-2022 走看看