又是被mld教育的一天
梗概
mld:
两个亿都能排序
三千万不是随随便便
mld:
你这写个鸡排不就过了
我:
1e9怎么鸡排
mld:
?
。。
你退役吧
巧了,我确实退役了
鸡排
就是先排个位,在排十位,如此类推
里面的排序部分用桶排实现
可以压位
配合循环展开使用更加
复杂度压得越多跑得越快
模板
上网看了一下,感觉用define比较好写一点
这里大概是4*n的
测试了一下3e7还是在1s内的
如果配合循环展开可以跑得更快
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
typedef long long LL;
const int N=30000005;
int n;
int f[N],g[N],d[N];
void solve()
{
#define half(a,b,k) \
memset(d, 0, sizeof d); \
for(int i=n;i>=1;i--) { \
d[a[i]k]++;\
} \
for(int i=1; i<256; i++) d[i] += d[i-1]; \
for(int i=n; i>=1; i--) { \
b[d[a[i]k]--]=a[i];\
}
half(f, g, &255);
half(g, f, >>8&255);
half(f, g, >>16&255);
half(g, f, >>24);
#undef half
}
int main()
{
scanf("%d",&n);
for (int u=1;u<=n;u++) f[u]=n-u;
solve();
int ans;
for (int u=1;u<=n;u++) ans^=f[u];
printf("%d\n",ans);
printf("%d ",f[n]);
return 0;
}