提交记录 20689


用户 题目 状态 得分 用时 内存 语言 代码长度
TSKY 1001b. 测测你的排序3 Accepted 100 12.029 s 1048616 KB C++14 1.51 KB
提交时间 评测时间
2023-12-02 00:47:37 2023-12-02 00:47:53
#include<cstdint>
#include<algorithm>

template<typename Iter>
void radix_sort_u32x11(Iter begin, Iter end)
{
    using Ty = decltype(+begin[0]);
    using LenTy = uint32_t;
    //static_assert(std::is_same<Ty,uint32_t>::value,"Must be uint32 ary");
    constexpr int RADIX_LEN=11;
    constexpr int segments = (sizeof(Ty)*8+RADIX_LEN-1)/RADIX_LEN;
    constexpr Ty RADIX = Ty(1)<<RADIX_LEN;
    LenTy len = end - begin;
    end = begin + len;
    LenTy  prefix[segments][RADIX]={};
    auto tmp = new Ty[len];
    for(auto it=begin;it<end;it++)
    {
        Ty n = *it;
        prefix[0][n%RADIX]++;
        prefix[1][(n>>11)%RADIX]++;
        prefix[2][n>>22]++;
    }
    for(int j=0;j<segments;j++)
    {
        Ty pre=0,last=prefix[j][0];
        prefix[j][0]=0;
        for(size_t i=1;i<RADIX;i++)
        {
            pre = prefix[j][i];
            prefix[j][i] = prefix[j][i-1] + last;
            last = pre;
        }
    }
    auto it_org=&begin[0],it_dst=&tmp[0];
    for(int seg=0;seg<segments;seg++)
    {
        const int shift = seg*RADIX_LEN;
        auto org_end = it_org+len;
        for(auto it = it_org;it<org_end;it++)
        {
            Ty org = *it;
            LenTy rem = (org>>shift)%RADIX;
            LenTy indx=prefix[seg][rem];
            it_dst[indx] = org;
            prefix[seg][rem]=indx+1;
        }
        std::swap(it_org,it_dst);
    }
    if(it_dst==&begin[0])
    {
        std::copy(tmp,tmp+len,begin);
    }
    delete[] tmp;
}

void sort(unsigned *a, int n) {
    radix_sort_u32x11(a,a+n);
}

CompilationN/AN/ACompile OKScore: N/A

Testcase #112.029 s1024 MB + 40 KBAcceptedScore: 100


Judge Duck Online | 评测鸭在线
Server Time: 2024-05-02 07:50:57 | Loaded in 0 ms | Server Status
个人娱乐项目,仅供学习交流使用