hdu 4657 Find Permutation

思路:用一个数组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("\n");

37         }

38         for(i=0;i<n;i++){

39             printf("%d",c[i]);

40             if(i!=n-1) printf(" ");

41             else printf("\n");

42         }

43     }

44     return 0;

45 }
View Code

 

 

 

你可能感兴趣的:(find)