排序(基數排序,構造題)

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
AC Code\rm AC \ Code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
#define N 15005
int n,m,a[N],rk[N];char s[N];
void solve(int t)
{
	printf("%d %s\n",t,s);vector<int> x[2];int i,j;
	for(i=0;i<n;i++)if(s[i]=='1')x[a[i]&1^t].push_back(a[i]);
	for(i=0;i<int(x[1].size());i++)x[0].push_back(x[1][i]);
	for(i=0,j=0;i<n;i++)if(s[i]=='1')a[i]=x[0][j++];
}
int main()
{
	int T,i,j;scanf("%d",&T);
	while(T--){
		memset(s,0,sizeof(s));
		scanf("%d%d",&n,&m);for(i=0;i<n;i++)scanf("%d",&a[i]);printf("29\n");
		bool flg=0;if(n&1){flg=1;n++;}
		for(i=0;i<n;i++){rk[i]=i;if(rk[i]>=(n>>1))rk[i]=n-rk[i]-1;}
		for(i=1;i<(n>>1);i+=2)swap(rk[i],rk[i+(n>>1)-(n%4==0)]);if(flg)n--;
		for(i=0;i<=13;i++){
			for(j=0;j<n;j++)s[j]='1';solve(0);
			for(j=0;j<n;j++)if(rk[a[j]]>>i&1)s[j]='1';else s[j]='0';solve(1);
		}
		for(i=0;i<n;i++)if(a[i]^i)s[i]='1';else s[i]='0';solve(1);
 	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章