Mai intai trebuie sa te autentifici.
Cod sursa(job #1474320)
Utilizator | Data | 21 august 2015 19:42:11 | |
---|---|---|---|
Problema | Radix Sort | Scor | 30 |
Compilator | cpp | Status | done |
Runda | Arhiva educationala | Marime | 1.8 kb |
#include <cstdio>
#include <cstring>
#include <vector>
#define NMAX 10000007
#define msk (1<<16) - 1
using namespace std;
FILE *fin, *fout;
int n, a, b, c, v[NMAX];
struct cntsort
{
vector<int> mem;
int sze;
} cntsort[msk+7];
int bucket(int nr, int x)
{
nr>>=((x-1)*16);
return nr&msk;
}
void citire()
{
scanf("%d %d %d %d", &n, &a, &b, &c);
v[1] = b;
for(int i = 2; i<= n; ++i)
{
v[i] = (1LL*a*v[i-1] + b)%c;
}
}
void radix(int st, int dr, int lvl)
{
if(lvl == 0) return ;
int tmp;
//memset(cntsort, 0, sizeof(cntsort));
for(int i = 0; i<= msk; ++i)
{
cntsort[i].sze = 0;
cntsort[i].mem.clear();
}
for(int i = st; i<= dr; ++i)
{
tmp = bucket(v[i], lvl);
cntsort[tmp].sze++;
cntsort[tmp].mem.push_back(v[i]);
}
tmp = st;
for(int i = 0; i<= msk; ++i)
{
for(int j = 0; j< cntsort[i].sze; ++j)
{
v[tmp] = cntsort[i].mem[j];
tmp++;
}
}
if(tmp != dr + 1) printf("check\n");
///selectie
int start = st, fin;
for(int i = st; i<= dr; ++i)
{
if(i == dr)
{
fin = i;
radix(start, fin, lvl-1);
break;
}
if(bucket(v[i+1], lvl) != bucket(v[i], lvl))
{
fin = i;
radix(start, fin, lvl-1);
start = i+1;
}
}
}
void afisare()
{
for(int i = 1; i<= n; i+=10)
{
printf("%d ", v[i]);
}
printf("\n");
}
int main()
{
fin = freopen("radixsort.in", "r", stdin);
fout = freopen("radixsort.out", "w", stdout);
citire();
radix(1, n, 2);
afisare();
fclose(fin);
fclose(fout);
return 0;
}