zoukankan      html  css  js  c++  java
  • 基数排序的奇技淫巧

      据说是WC T2的子任务,ai<=2^32-1的基数排序,那么就把一个数分成几段多关键字基数排序就行了,类似后缀数组?

      分成8位/8位/8位/8位比分成16位/16位要快【丧病的底层优化

      写的是16/16的

    代码如下:

    #include<iostream>
    #include<cstdlib>
    #include<cstring>
    #include<cstdio>
    #include<algorithm>
    #include<queue>
    #include<cmath>
    #include<map>
    #define ll long long 
    using namespace std;
    const int maxn=500010,inf=1e9;
    int n,m,x,y,z,tot;
    int a[maxn],sa[maxn],sa2[maxn],sum[65536];
    void read(int &k)
    {
        int f=1;k=0;char c=getchar();
        while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();
        while(c<='9'&&c>='0')k=k*10+c-'0',c=getchar();
        k*=f;
    }
    int main()
    {
        read(n);m=65535;
        for(int i=1;i<=n;i++)read(a[i]);
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)sum[a[i]&((1<<16)-1)]++;
        for(int i=1;i<=m;i++)sum[i]+=sum[i-1];
        for(int i=n;i;i--)sa2[sum[a[i]&((1<<16)-1)]--]=i;
        memset(sum,0,sizeof(sum));
        for(int i=1;i<=n;i++)sum[a[i]>>16]++;
        for(int i=1;i<=m;i++)sum[i]+=sum[i-1];
        for(int i=n;i;i--)sa[sum[a[sa2[i]]>>16]--]=sa2[i];
        for(int i=1;i<=n;i++)printf("%d ",a[sa2[i]]);
        return 0;
    }
    View Code
  • 相关阅读:
    ASA5505升级license
    Elasticsearch-URL查询实例解析
    awk和sed
    ftp无法上传问题
    linux使用storcli64查看硬盘信息
    Centos7中kubernetes-1.11.2基于配置亲和与反亲和
    Centos7使用kubeadm部署kubernetes-1.11.2
    内网映射3种方法
    centos6.5使用LVM
    centos7部署openstack-ocata
  • 原文地址:https://www.cnblogs.com/Sakits/p/6391750.html
Copyright © 2011-2022 走看看