【【WC2017】挑战】卡常真好玩,卡到了loj rank1(2019.1.29)
// luogu-judger-enable-o2
#include
#include
#include
typedef unsigned int u32;
typedef unsigned long long u64;
inline void output_arr(u32 *A, u32 size) {
u32 ret = size * sizeof(u32);
u32 x = 23333333;
const u32 * ed = A + size;
for (u32*i=A;
i!=ed;
++ i){
ret^=*i+x,x^=x<<13,x^=x>>17,x^=x<<5;
}
printf("%u\n", ret);
}namespace Sorting {
int cnt0[256],cnt8[256],cnt16[256],cnt24[256];
u32 *a,*b;
inline void init_data(u32 *a, int n,u32 seed) {
const u32 * ed = a + n;
for (u32*i = a;
i != ed;
++ i){
seed ^= seed << 13,seed ^= seed >> 17,seed ^= seed << 5;
*i=seed;
++cnt0[seed & 255], ++cnt8[seed >> 8 & 255],
++cnt16[seed >> 16 & 255], ++cnt24[seed >> 24];
}
for(int i=1;
i<256;
++i)
cnt0[i] += cnt0[i-1],
cnt8[i] += cnt8[i-1],
cnt16[i] += cnt16[i-1],
cnt24[i] += cnt24[i-1];
register u32*i;
for(i=a+n-1;
i>a;
i-=8){
b[--cnt0[*i&255]]=*i;
b[--cnt0[i[-1]&255]]=i[-1];
b[--cnt0[i[-2]&255]]=i[-2];
b[--cnt0[i[-3]&255]]=i[-3];
b[--cnt0[i[-4]&255]]=i[-4];
b[--cnt0[i[-5]&255]]=i[-5];
b[--cnt0[i[-6]&255]]=i[-6];
b[--cnt0[i[-7]&255]]=i[-7];
}
for(i=b+n-1;
i>b;
i-=8){
a[--cnt8[*i>>8&255]]=*i;
a[--cnt8[i[-1]>>8&255]]=i[-1];
a[--cnt8[i[-2]>>8&255]]=i[-2];
a[--cnt8[i[-3]>>8&255]]=i[-3];
a[--cnt8[i[-4]>>8&255]]=i[-4];
a[--cnt8[i[-5]>>8&255]]=i[-5];
a[--cnt8[i[-6]>>8&255]]=i[-6];
a[--cnt8[i[-7]>>8&255]]=i[-7];
}
for(i=a+n-1;
i>a;
i-=8){
b[--cnt16[*i>>16&255]]=*i;
b[--cnt16[i[-1]>>16&255]]=i[-1];
b[--cnt16[i[-2]>>16&255]]=i[-2];
b[--cnt16[i[-3]>>16&255]]=i[-3];
b[--cnt16[i[-4]>>16&255]]=i[-4];
b[--cnt16[i[-5]>>16&255]]=i[-5];
b[--cnt16[i[-6]>>16&255]]=i[-6];
b[--cnt16[i[-7]>>16&255]]=i[-7];
}
for(i=b+n-1;
i>b;
i-=8){
a[--cnt24[*i>>24]]=*i;
a[--cnt24[i[-1]>>24]]=i[-1];
a[--cnt24[i[-2]>>24]]=i[-2];
a[--cnt24[i[-3]>>24]]=i[-3];
a[--cnt24[i[-4]>>24]]=i[-4];
a[--cnt24[i[-5]>>24]]=i[-5];
a[--cnt24[i[-6]>>24]]=i[-6];
a[--cnt24[i[-7]>>24]]=i[-7];
}
}
int n;
inline void main() {
register u32 seed;
scanf("%d%u", &n, &seed);
a = new u32[n<<1];
b = a + n;
init_data(a, n, seed);
output_arr(a, n);
}
}namespace Game {
int n,q;
u64 f1[64][20000];
u64 f2[64][20000];
inline void add(u64 f[64][20000],int bit){
if(bit < 64)
for(int i=0;
i<=bit;
++i)
*f[i]|=1ull<< bit-i;
else for(int i=0;
i<64;
++i)
f[i][bit-i>>6] |= 1ull << (bit-i&63);
}
inline void init(char * s1,char * s2){
for(int i=0;
i> 6;
u64*i=f1[x&63]+(x>>6),*j=f2[y&63]+(y>>6);
int ans=0,cnt=0;
for(;
cnt+8
转载于:https://www.cnblogs.com/skip1978/p/10332528.html