题目大意:

现在对于一个序列有如下操作,首先选取一个位置,该位置的数我们称作被处理数。被处理数的值和他的位置标号的和作为下一个新的被处理数的位置,现在告诉你m次操作的被处理数的位置分别是多少,问你是否可以找出一个1~n的全排列符合条件。

分析:

其实,O(max(m,n))的时间复杂度就够了,因为对于每一个当前被处理数的位置和上一个被处理数,都可以求得当前被处理数位置上的值。这样我只要扫一遍O(m)就能得到为了满足要求各个位置的值是多少了。然后对于其他值没有确定的位置,我只要依次填入1~n不重复的数字就可以了。

代码:

#include<bits/stdc++.h>
using namespace std;
#define maxn 500
int n,m;
int appear[maxn]={0};
int a[maxn]={0};
int l[maxn]={0};
bool flag=0;
int main()
{
    scanf("%d%d%d",&n,&m,&l[0]);
    for(int i=1;i<m;i++)
    {
        scanf("%d",&l[i]);
        int t=(l[i]-l[i-1]>0)?(l[i]-l[i-1]):(l[i]-l[i-1]+n);
        //cout<<t<<" ";
        if(a[l[i-1]]!=0&&a[l[i-1]]!=t||appear[t]==1&&a[l[i-1]]==0)
        {
            flag=1;
        }
        else
        {
            appear[t]=1;
            a[l[i-1]]=t;
        }
    }

    if(flag==1)
    {
        printf("-1\n");
        return 0;
    }
    int k=1;
    for(int i=1;i<n;i++)
    {
        while(appear[k]!=0)
        {
            k++;
        }
        printf("%d ",a[i]==0?k++:a[i]);
    }
    while(appear[k]!=0)
    {
        k++;
    }
    printf("%d\n",a[n]==0?k:a[n]);
}