zoukankan      html  css  js  c++  java
  • 3689: 异或之

    3689: 异或之

    Time Limit: 10 Sec  Memory Limit: 256 MB
    Submit: 262  Solved: 120
    [Submit][Status][Discuss]

    Description

    给定n个非负整数A[1], A[2], ……, A[n]。
    对于每对(i, j)满足1 <= i < j <= n,得到一个新的数A[i] xor A[j],这样共有n*(n-1)/2个新的数。求这些数(不包含A[i])中前k小的数。
    注:xor对应于pascal中的“xor”,C++中的“^”。

    Input

    第一行2个正整数 n,k,如题所述。
    以下n行,每行一个非负整数表示A[i]。

    Output

     共一行k个数,表示前k小的数。

    Sample Input

    4 5
    1
    1
    3
    4

    Sample Output

    0 2 2 5 5

    HINT

    【样例解释】

    1 xor 1 = 0 (A[1] xor A[2])

    1 xor 3 = 2 (A[1] xor A[3])

    1 xor 4 = 5 (A[1] xor A[4])

    1 xor 3 = 2 (A[2] xor A[3])

    1 xor 4 = 5 (A[2] xor A[4])

    3 xor 4 = 7 (A[3] xor A[4])

    前5小的数:0 2 2 5 5

    【数据范围】

     对于100%的数据,2 <= n <= 100000; 1 <= k <= min{250000, n*(n-1)/2};

            0 <= A[i] < 2^31

    Source

    #include<cstdio>
    #include<queue>
    using namespace std;
    int read(){
        register int x=0;bool f=1;
        register char ch=getchar();
        while(ch<'0'||ch>'9'){if(ch=='-')f=0;ch=getchar();}
        while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
        return f?x:-x;
    }
    const int N=1e5+10;
    struct node{
        int a,v,k;
        bool operator <(const node &t)const{
            return v>t.v;
        }
    }z;
    priority_queue<node>q;
    int n,m,K,cnt,a[N],siz[N*31],tr[N*31][2];
    void ins(int x){
        int now=0;
        for(int i=30;i>=0;i--){
            int t=x&(1<<i);t>>=i;
            if(!tr[now][t]) tr[now][t]=++cnt;
            now=tr[now][t];siz[now]++;
        }
    }
    int query(int x,int k){
        int now=0,ans=0;
        for(int i=30;i>=0;i--){
            int t=x&(1<<i);t>>=i;
            if(siz[tr[now][t]]>=k) now=tr[now][t];
            else k-=siz[tr[now][t]],now=tr[now][t^1],ans+=(1<<i);
        }
        return ans;
    }
    int main(){
        n=read();K=read();
        for(int i=1;i<=n;i++) a[i]=read(),ins(a[i]);
        for(int i=1;i<=n;i++){
            z.v=query(z.a=a[i],z.k=2);
            q.push(z);
        }
        for(int i=1;i<2*K;i++){
            z=q.top();q.pop();
            if(i&1) printf("%d ",z.v);
            z.v=query(z.a,++z.k);
            q.push(z);
        }
        return 0;
    }
  • 相关阅读:
    Spring(九)之事件处理
    Spring(八)之基于Java配置
    Spring(七)之基于注解配置
    Spring(六)之自动装配
    Spring(五)之Bean定义继承和依赖注入
    Spring(四)之Bean生命周期、BeanPost处理
    开源 视频会议 收藏
    摄像头拍照录相代码,没摄像头测试,
    什么是ICE (Internet Communications Engine)
    AForge.NET Framework-2.2.5
  • 原文地址:https://www.cnblogs.com/shenben/p/6251640.html
Copyright © 2011-2022 走看看