hihoCoder1509 : 异或排序

来源:互联网 发布:windows services.msc 编辑:程序博客网 时间:2024/06/10 19:34

简述

  这题很有趣的
  随便打两个二进制数
  

100100100100101100123456789

  第三行是下标,方便描述。
  二进制数比较肯定是字典序,从最高位开始比较,直到遇到第一个不一样的位,这个位上哪个数等于1哪个数就较大。
  想要构造一个S,异或上之后第一个数大于第二个数,显然从前往后比较的时候,一开始连续相同的位即使同时异或上一个数,也不会改变他们的大小关系。对于第一个不相等的位,比如上面的6这一位,想要让后面大于前面,S中这一位就必须是0,我如果把上下两个数交换,新情形下S的这一位就必须是1,确定了S的这一位之后,后面的就没有限制了。
  那么就每两个相邻的数搞一搞,如果有冲突就直接输出0,否则输出
2

代码

//数学#include <cstdio>#include <algorithm>#define maxn 100#define ll long longusing namespace std;ll a[maxn], N, cnt[maxn];int main(){    ll i, j, last, now, ans=1;    scanf("%lld%lld",&N,&last);    for(i=0;i<=59;i++)cnt[i]=-1;    for(i=2;i<=N;i++,last=now)    {        scanf("%lld",&now);        for(j=59;j>=0;j--)            if((last^now)&(1ll<<j))            {                if(last&(1ll<<j))                {                    if(cnt[j]==-1)cnt[j]=1;                    if(cnt[j]==0){printf("0");return 0;}                }                else                {                    if(cnt[j]=-1)cnt[j]=0;                    if(cnt[j]==1){printf("0");return 0;}                }                break;            }    }    for(i=0;i<=59;i++)if(cnt[i]==-1)ans<<=1;    printf("%lld",ans);    return 0;}
0 0