HDU 5014 Number Sequence (2014 ACM/ICPC Asia Regional Xi 'an Online), hdu5014
Question link: http://acm.hdu.edu.cn/showproblem.php? Pid = 1, 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 in [0, n]
● Ai = aj (I = j)
For sequence a and sequence B, the integrating degree t is defined as follows ("writable" denotes exclusive or ):
T = (a0 rjb0) + (a1 rjb1) + · + (an 1_bn)
(Sequence B shoshould also satisfy the rules described abve)
Now give you a number n and the sequence a. You shoshould 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,...,.
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 has replaced _ int64 with long. The idea is very simple. Try to complete the values 0 and 1 of the two binary numbers, and give priority to a large number. However, you need to find the interval.
Code:
#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;}