• hihocoder #1509 : 异或排序


    很有意思的题 中文 

    一开始拿到这个题没头绪

    2^60的话  考虑相邻2个数 

    a     0 1  0  1  0  0

    b     0  0 1 0 0 0 0

    他们最高位不相同的  相同的异或同一个数还是相同所以考虑这位  0  1   那么s这位一定要是  0  ,  0 1   就相反  然后都不能矛盾 这样就解决了 

    #include<cstdio>
    #include<cstring>
    #include<map>
    #include<iostream>
    #include<algorithm>
    #include<math.h>
    #include<map>
    #include<queue>
    #include<vector>
    using namespace std;
    
    
    #define inf  1000000007
    #define ll long long
    #define MAXN   1010
    
    ll z[MAXN];
    int d[MAXN][80];
    int p[MAXN];
    
    int main()
    {
        int n;
        while(scanf("%d",&n)!=EOF)
        {
            memset(d,0,sizeof(d));
            memset(p,-1,sizeof(p));
            for(int i=1;i<=n;i++)
                scanf("%lld",&z[i]);
            for(int i=1;i<=n;i++)
            {
                for(int j=0;j<=59;j++)
                {
                    
                    d[i][j]=(z[i]&((ll)1<<j));
                }
            }
            int ok=0;
            for(int i=2;i<=n;i++)
            {
                for(int j=59;j>=0;j--)
                {
                    if(d[i][j]!=d[i-1][j])
                    {
                        if(d[i][j]==0&&d[i-1][j]==1)
                        {
                            if(p[j]==-1)
                            {
                                p[j]=1;
                            }
                            else if(p[j]==0)
                                ok=1;
                        }
                        else
                        {
                            if(p[j]==-1)
                            {
                                p[j]=0;
                            }
                            else if(p[j]==1)
                                ok=1;
                        }
                        break;
                    }
                }
            }
            ll ans;
            if(ok==1)
                ans=0;
            else
            {
                int cnt=0;
                for(int i=0;i<60;i++)
                    if(p[i]==-1)
                        cnt++;
                ans=(ll)1<<cnt;
            }
            cout<<ans<<endl;
        }
        return 0;
    }
    View Code

     

  • 相关阅读:
    [HAOI2011] 向量
    [HNOI2004] 树的计数
    [TJOI2009] 猜数字
    Wannafly Camp 2020 Day 6K 最大权值排列
    [HAOI2012] 容易题
    [ZJOI2008] 生日聚会
    [CQOI2007] 余数求和
    [CQOI2009] 中位数
    [SDOI2012] Longge的问题
    我的Apache又挂了之apache错误:server's fully qualified domain name, using 127.0.0.1. Set the 'ServerName'
  • 原文地址:https://www.cnblogs.com/cherryMJY/p/7793997.html
Copyright © 2020-2023  润新知