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
  • 相关阅读:
    Python max() 函数
    Python log10() 函数
    Python log() 函数
    Python fabs() 函数
    Java开源-astar:A 星算法
    9款超绚丽的HTML5/CSS3应用和动画特效
    Java中处理异常的9个最佳实践
    Java泛型
    Android界面性能调优手册
    正确使用Android性能分析工具——TraceView
  • 原文地址:https://www.cnblogs.com/Sakits/p/6391750.html
Copyright © 2011-2022 走看看