思路:用一个数组index[]存放a的下标,初始化令a[i]=c[i]=index[i]=i;
假设当前处理的i,初始时令cur=i;j为大于i的任意值。每次操作找a[l]=c[cur]-b[cur]。
若cur==l则结束;否则交换a[l]和a[cur]的值以及下标。若l>i,那么结束;否则令cur=l,
然后交换c[cur]和c[j],继续处理知道该轮结束。
代码如下:
1 #include<iostream> 2 #include<stdio.h> 3 #include<algorithm> 4 #include<iomanip> 5 #include<cmath> 6 #include<ctime> 7 #include<cstring> 8 #include<vector> 9 #define ll __int64 10 #define pi acos(-1.0) 11 #define MAX 100005 12 #define mod 1000003 13 using namespace std; 14 int a[MAX],b[MAX],c[MAX],index[MAX]; 15 int main(){ 16 int t,n,i,j; 17 scanf("%d",&t); 18 while(t--){ 19 scanf("%d",&n); 20 for(i=0;i<n;i++) scanf("%d",&b[i]); 21 for(i=0;i<n;i++) a[i]=c[i]=index[i]=i; 22 for(i=0;i<n;i++){ 23 int cur=i; 24 while((a[cur]+b[cur])%n!=c[cur]){ 25 int l = index[(c[cur]-b[cur]+n)%n]; 26 swap(a[l],a[cur]); 27 swap(index[a[l]],index[a[cur]]); 28 if(l>i) break; 29 cur=l; 30 swap(c[i+1],c[cur]); 31 } 32 } 33 for(i=0;i<n;i++){ 34 printf("%d",a[i]); 35 if(i!=n-1) printf(" "); 36 else printf(" "); 37 } 38 for(i=0;i<n;i++){ 39 printf("%d",c[i]); 40 if(i!=n-1) printf(" "); 41 else printf(" "); 42 } 43 } 44 return 0; 45 }