• 【HIHOCODER 1509 】 异或排序


    描述

    给定一个长度为 n 的非负整数序列 a[1..n]
    你需要求有多少个非负整数 S 满足以下两个条件:
    (1).0 ≤ S < 260
    (2).对于所有 1 ≤ i < n ,有 (a[i] xor S) ≤ (a[i+1] xor S)

    输入

    第一行一个正整数 n
    第二行 n 个非负整数表示序列 a[1..n]
    1 ≤ n ≤ 50
    0 ≤ a[i] < 260

    输出

    一个非负正数,表示答案

    样例输入

    3
    1 2 3

    样例输出

    288230376151711744

    题解

    对于两个相邻的数,如果(a[i]>a[i+1])那么调整它们的最小代价是将S最高且不相同位置为1,反之,维持(a[i]<a[i+1])的最小代价是将该位置为0.
    这些都是固定位,那么最终答案就是非固定位任选。

    参考代码

    #include<queue>
    #include<cmath>
    #include<cstdio>
    #include<cstring>
    #include<cstdlib>
    #include<iostream>
    #include<algorithm>
    #define ll long long
    #define inf 1000000000
    using namespace std;
    ll read(){
        ll x=0,f=1;char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return x*f;
    }
    void Out(ll a){
        if(a<0) putchar('-'),a=-a;
        if(a>=10) Out(a/10);
        putchar(a%10+'0');
    }
    const int N=105;
    ll a[N],c[N];
    int main(){
        int n=read();
        memset(c,-1,sizeof(c));
        for(int i=0;i<n;i++) a[i]=read();
        for(int i=1;i<n;i++){
           int flag=(a[i-1]>a[i]);
           ll x=a[i-1]^a[i],tmp=1LL;
           for(int j=59;j>=0;j--){
                if((tmp<<j)<=x){
                     if(c[j]!=-1&&c[j]!=flag){
                        puts("0");
                        return 0;
                     }
                     c[j]=flag;
                     break;
                }
           }
        }
        ll sum=0;
        for(int i=0;i<=59;i++) if(c[i]==-1) sum++;
        printf("%lld
    ",1LL<<sum);
        return 0;
    }
    
    
  • 相关阅读:
    Linux系统介绍(二)文件系统结构
    为Docker Swarm添加调度策略
    Docker 三剑客之 Docker Swarm
    Hadoop中文文档
    hadoop 学习笔记:mapreduce框架详解
    Java进阶-- GUI
    ceph(8)--关于Ceph PGs
    今天在学习NTP时发现了2个网站
    开始学红帽的RHCE课堂有2次课了,要记下自己的学习经历
    Switch能否用string做参数
  • 原文地址:https://www.cnblogs.com/zsyacm666666/p/7182400.html
Copyright © 2020-2023  润新知