HDU5014 2014ACM-ICPC 亚洲区域赛西安赛区网络赛H题 Number Sequence
2014-09-21 10:25
435 查看
Number Sequence
Time Limit: 4000/2000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others)Total Submission(s): 1885 Accepted Submission(s): 561
Special Judge
[align=left]Problem Description[/align]
There 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.
[align=left]Input[/align]
There 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.
[align=left]Output[/align]
For 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.
[align=left]Sample Input[/align]
4 2 0 1 4 3
[align=left]Sample Output[/align]
20 1 0 2 3 4
这题在之前做时候完全想不到思路,直到比赛2小时脑子里突然闪现出一个YY思路,那就是如果对于一个0-n的序列,能构成的最大异或序列,需要这样构想,对于n,能构成的最大数字需要与n取反配对(n与n取反异或运算后所有二进制位置均为1,即最大),我们设n取反为m,那么n-1应当与m+1配对,依次类推。这样,我们得到了m-n所有的配对方式。然后,不断循环配对m-1与m-1取反区间内的数字,直到配对至0则完成全部配对,此时即为异或配对的最大值。。。输出即为答案。。。还是挺简单的嘛。。。
#include<cstdio> #include<iostream> #include<cstring> #include<cmath> #include<cstdlib> #include<algorithm> #include<map> #include<vector> #include<queue> using namespace std; __int64 a[100005],pa[100005]; __int64 cal(__int64 pa) { __int64 ans=0,n=0; while(pa>0) { a =pa%2; n++; pa=pa/2; } __int64 tap=1; for(int j=0;j<n;j++) { if(a[j]==0) ans+=tap; tap=tap*2; } return ans; } int main() { // freopen("in.txt","r",stdin); int n; while(cin>>n) { for(int i=0;i<=n;i++) scanf("%d",&pa[i]); __int64 pat=cal(n),sum=0,psum=0; sum+=(n-pat)*(pat+n+1); for(int i=pat,j=n;i<=n;i++) { a[i]=j; psum+=(i^j); j--; } pat--; while(pat>0) { __int64 item=cal(pat); for(int i=item,j=pat;i<=pat;i++) { a[i]=j; psum+=(i^j); j--; } sum+=(pat-item)*(pat+item+1); pat=item; pat--; } cout<<psum<<endl; for(int i=0;i<n;i++) printf("%d ",a[pa[i]]); printf("%d\n",a[pa ]); } return 0; }
相关文章推荐
- ZOJ3819 ACM-ICPC 2014 亚洲区域赛牡丹江赛区现场赛A题 Average Score 签到题
- ZOJ3822 ACM-ICPC 2014 亚洲区域赛牡丹江赛区现场赛D题Domination 概率DP(两种解法)
- 2014 ACM-ICPC 亚洲区域赛 鞍山赛区 比赛小结 & 部分题解
- HDU5078 2014 ACM-ICPC亚洲区域赛鞍山赛区现场赛I题 Osu! 签到题
- HDU5024 2014 ACM-ICPC亚洲区域赛广州赛区网络赛C题 Wang Xifeng's Little Plot
- ZOJ3822 ACM-ICPC 2014 亚洲区域赛牡丹江赛区现场赛D题Domination 概率DP
- ZOJ3829 ACM-ICPC 2014 亚洲区域赛牡丹江赛区现场赛K题 Known Notation 贪心
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Trig Function(数据水,暴力+逆元)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B:coin
- 计蒜客17116 Sum 找规律 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function cos(nx)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 Coin(组合数)
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 F. Trig Function
- 2013 ACM/ICPC 亚洲区域赛长春赛区 总结
- HDU5074 ACM-ICPC亚洲区域赛鞍山赛区现场赛E题 Hatsune Miku 二维DP
- HDU 5115 Dire Wolf (2014ACM亚洲区域赛北京赛区重现)D
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛
- 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 B. Coin(概率)
- 【找规律】计蒜客17118 2017 ACM-ICPC 亚洲区(西安赛区)网络赛 E. Maximum Flow