码迷,mamicode.com
首页 > 其他好文 > 详细

Codeforces Round #177 (Div. 2)---E. Polo the Penguin and XOR operation

时间:2016-07-21 22:03:10      阅读:131      评论:0      收藏:0      [点我收藏+]

标签:

题意:让你构造一个序列,使得序列异或和最大,序列为n 的全排列 ,序列和计算方式为 SUM = a[1] ^ 0 + a[2] ^ 1 + a[3] ^ 2 + .......a[n] ^ n

感想 :之前没做过有关位运算的题,对这一块很陌生,两个数异或以后,如果二进制每一位都为1,那么一定最大,找规律发现当n为偶数时 除开0以外,其他的都是成对出现

当n为奇数时 都是成对出现 例如n=4, 0 1 2 3 4 分别对应0 2 1 4 3 ;n=5时 0 1 2 3 4 5 分别对应1 0 5 4 3 2 自己可以在草稿纸上模拟下;

ac代码:

#include<iostream>
#include<cstring>
#include<cstdio>
typedef __int64 ll;
using namespace std;
ll result[1000010];
ll n;
int main()
{
      while(scanf("%I64d",&n)!=EOF)
     {
           ll k=1;
           while(k<=n)
           k*=2;
           k--;
           memset(result,-1,sizeof(result));
           for(int i=n;i>=0;i--)//反着找 不用分奇数和偶数讨论
          {
                   if(result[i]!=-1)//已经匹配了  继续下一个数
                      continue;
                   else
                  {
                          while((k^i)>n||result[k^i]!=-1)
                                   k/=2;
                          result[k^i]=i;
                          result[i]=k^i;//例如上面第二个例子中   result[2]=5;result[5]=2;
                   }
            }//注  w^q^q=w;上面的k即为下面j^result[j]的结果
            ll sum=0;
            for(int j=0;j<=n;j++)
            sum+=j^result[j];
            printf("%I64d\n",sum);
            for(int q=0;q<n;q++)
            printf("%I64d ",result[q]);
            printf("%I64d\n",result[n]);
      }
      return 0;
}

//不好的话直接提出来 ,本人水平太低了 望大家指教

Codeforces Round #177 (Div. 2)---E. Polo the Penguin and XOR operation

标签:

原文地址:http://www.cnblogs.com/TWhh/p/5693191.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!