提交记录 39768
| 提交时间 |
评测时间 |
| 2026-08-16 19:23:53 |
2026-08-16 19:23:59 |
#include <string.h>
#include <stdint.h>
typedef unsigned int u32;
typedef unsigned char u8;
static u32 tmp[(1u<<27) + (1u<<21)] __attribute__((aligned(64)));
static u32 cnt[65536];
static u32 rbase[65536];
static u32 pbase[65536];
static u32 off[65536];
static u8 pos[65536];
static u32 staging[65536 * 16] __attribute__((aligned(64)));
static u32 scratch[65536] __attribute__((aligned(64)));
static u32 bc[256];
#define FLUSH(d,s) do { u32 *_d=(d),*_s=(s); _d[0]=_s[0]; _d[1]=_s[1]; _d[2]=_s[2]; _d[3]=_s[3]; _d[4]=_s[4]; _d[5]=_s[5]; _d[6]=_s[6]; _d[7]=_s[7]; _d[8]=_s[8]; _d[9]=_s[9]; _d[10]=_s[10]; _d[11]=_s[11]; _d[12]=_s[12]; _d[13]=_s[13]; _d[14]=_s[14]; _d[15]=_s[15]; } while(0)
static void radix16_top(u32 *src, u32 *dst, int n) {
int i, j;
for (j = 0; j < 65536; j++) cnt[j] = 0;
for (i = 0; i < n; i++) { __builtin_prefetch(&src[i+256],0,0); cnt[src[i] >> 16]++; }
{ u32 t = 0, p = 0; for (j = 0; j < 65536; j++) { u32 c = cnt[j]; rbase[j] = t; pbase[j] = p; t += c; p = (p + c + 15) & ~15u; } }
for (j = 0; j < 65536; j++) { off[j] = pbase[j]; pos[j] = 0; }
for (i = 0; i < n; i++) {
__builtin_prefetch(&src[i+256],0,0);
u32 x = src[i]; u32 b = x >> 16; u32 p = pos[b];
staging[b * 16 + p] = x; p++;
if (p == 16) { u32 go = off[b]; FLUSH(dst+go, staging+b*16); off[b] = go + 16; p = 0; }
pos[b] = (u8)p;
}
for (j = 0; j < 65536; j++) { u32 p = pos[j]; if (p > 0) memcpy(dst+off[j], staging+j*16, p*4); }
}
static void sort_bucket(u32 *src, u32 *dst, int m) {
int i, j;
for (j = 0; j < 256; j++) bc[j] = 0;
for (i = 0; i < m; i++) bc[src[i] & 255]++;
for (j = 1; j < 256; j++) bc[j] += bc[j-1];
for (i = m - 1; i >= 0; i--) { u32 x = src[i]; scratch[--bc[x & 255]] = x; }
for (j = 0; j < 256; j++) bc[j] = 0;
for (i = 0; i < m; i++) bc[(scratch[i] >> 8) & 255]++;
for (j = 1; j < 256; j++) bc[j] += bc[j-1];
for (i = m - 1; i >= 0; i--) { u32 x = scratch[i]; dst[--bc[(x >> 8) & 255]] = x; }
}
void sort(unsigned *aa, int n) {
u32 *a = (u32*)aa;
int j;
radix16_top(a, tmp, n);
for (j = 0; j < 65536; j++) {
int m = (int)cnt[j];
if (m > 0) sort_bucket(tmp + pbase[j], a + rbase[j], m);
}
}
| Compilation | N/A | N/A | Compile OK | Score: N/A | 显示更多 |
| Testcase #1 | 1.706 s | 1030 MB + 976 KB | Accepted | Score: 100 | 显示更多 |
Judge Duck Online | 评测鸭在线
Server Time: 2026-09-04 02:11:27 | Loaded in 1 ms | Server Status
个人娱乐项目,仅供学习交流使用 | 捐赠