CodeForces

来源:互联网 发布:淘宝商品信用卡套现 编辑:程序博客网 时间:2024/06/01 10:13

题目大意:

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

分析:

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

代码:

#include<bits/stdc++.h>using namespace std;#define maxn 500int 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]);}
原创粉丝点击