HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi'an Online) 題解,hdu5014

來源:互聯網
上載者:User

HDU 5014 Number Sequence(2014 ACM/ICPC Asia Regional Xi'an Online) 題解,hdu5014

題目連結:http://acm.hdu.edu.cn/showproblem.php?pid=5014

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

● ai ∈ [0,n] 
● ai ≠ aj( i ≠ j )

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

t = (a0 ⊕ b0) + (a1 ⊕ b1) +···+ (an ⊕ bn)

(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.
 
InputThere are multiple test cases. Please process till EOF. 

For each case, the first line contains an integer n(1 ≤ n ≤ 105), The second line contains a0,a1,a2,...,an.
 
OutputFor each case, output two lines.The first line contains the maximum integrating degree t. The second line contains n+1 integers b0,b1,b2,...,bn. There is exactly one space between bi and bi+1 (0 ≤ i ≤ n - 1). Don’t ouput any spaces after bn.
 
Sample Input
42 0 1 4 3
 
Sample Output
201 0 2 3 4
 
Source2014 ACM/ICPC Asia Regional Xi'an Online 

HDU坑爹爆long long,換了__int64過了。想法很簡單,把兩個數二進位的0和1盡量補全,優先滿足大的數就可以了。不過要找到區間。

代碼:

#include <iostream>#include <cstdio>using namespace std;__int64 n, a[100010];struct right{    __int64 s, r, l;}rt[1000];__int64 getNear(__int64 x){    __int64 z = 1;    while(x)    {        x >>= 1;        z <<= 1;    }    return z-1;}int main(){    while(~scanf("%I64d", &n))    {        __int64 m = n;        rt[0].r = m;        rt[0].s = getNear(m);        rt[0].l = rt[0].s-rt[0].r;        //cout << rt[0].l << " " << rt[0].r << " " << rt[0].s << endl;        __int64 cnt = 0;        while(1)        {            m = rt[cnt].l-1;            if(m  < 0) break;            cnt++;            rt[cnt].r = m;            rt[cnt].s = getNear(m);            rt[cnt].l = rt[cnt].s-rt[cnt].r;            //cout << rt[cnt].l << " " << rt[cnt].r << " " << rt[cnt].s << endl;        }        for(__int64 i = 0; i <= n; i++)            scanf("%I64d", &a[i]);            //a[i] = i;        __int64 t = 0;        for(__int64 i = 0; i <= n; i++)            for(__int64 j = 0; j <= cnt; j++)            {                if(a[i] >= rt[j].l && a[i] <= rt[j].r)                {                    //cout << rt[j].l << " " << rt[j].r << " " << rt[j].s << endl;                    //printf("%d ", rt[j].s-a[i]);                    a[i] = rt[j].s-a[i];                    t += rt[j].s;                    break;                }            }            printf("%I64d\n", t);            for(__int64 i = 0; i < n; i++)                printf("%I64d ", a[i]);            printf("%I64d\n", a[n]);    }    return 0;}





聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.