记录编号 29031 评测结果 AAAAAAAAAA
题目名称 [NOI 2009]变换序列 最终得分 100
用户昵称 Gravatar苏轼 是否通过 通过
代码语言 C++ 运行时间 0.036 s
提交时间 2011-10-19 19:45:01 内存使用 0.26 MiB
显示代码纯文本
#include <cstdio>
#include <bitset>

using namespace std;

typedef int way_t[2];

int N;
way_t *way;
int *mat, *rmat;
bitset<10001> boo;

bool path (const int wh)
{
    int i = -1;
    while (++i < 2)
        if (!boo[way[wh][i]])
        {
            boo[way[wh][i]] = 1;
            if (mat[way[wh][i]] == 0 ||
                    path(mat[way[wh][i]]))
            {
                mat[way[wh][i]] = wh;
                rmat[wh] = way[wh][i];
                return true;
            }
        }

    return false;
}

int main ()
{
    freopen("transform.in", "r", stdin);
    freopen("transform.out", "w", stdout);

    scanf("%d", &N);
    mat = new int[N];
    rmat = new int[N];
    way = new way_t[N];

    for (int i=0; i<=N; i++)
    {
        int a;
        scanf("%d", &a);

        way[i][0] = (i-a)>=0 ? i-a : i-a+N,
        way[i][1] = (i+a)>=N ? i+a-N : i+a;

        if (way[i][0] > way[i][1])
        {
            int t = way[i][0];
            way[i][0] = way[i][1];
            way[i][1] = t;
        }
        else if (way[i][0] == way[i][1])
            way[i][1] = N;

    }

    int ct = 0;
    for (int i=N-1; i>=0; i--)
    {
        boo.reset();
        boo[N] = 1;
        if (path(i))
            ct++;
    }

    if (ct == N)
    {
        for (int i=0; i<N; i++)
            printf("%d ", rmat[i]);
        putchar('\n');
    }
    else
        puts("No Answer\n");

    return 0;
}