hihoCoder1509 : 异或排序

xiaoxiao2021-02-28  91

简述

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

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

代码

//数学 #include <cstdio> #include <algorithm> #define maxn 100 #define ll long long using 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; }
转载请注明原文地址: https://www.6miu.com/read-56616.html

最新回复(0)