题目链接
http://www.lydsy.com/JudgeOnline/problem.php?id=1562
题目大意
有一个
长为n的
序列
A
,对于任意的
题目思路
如果只要判断合法性,这就是个裸的二分图匹配问题,将
A中的每个Ai
与
T中的数字(Ai+di)
mod
n
,
然后很无脑地贡献了4发PE,坑爹的BZOJ居然不能输出行末空格和文末换行
代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <algorithm>
#include <vector>
#define MAXE 1100000
#define MAXV 31000
using namespace std;
int n;
int pre[MAXV];
bool visit[MAXV];
vector<int>G[MAXV];
bool dfs(int u)
{
for(int i=0;i<(int)G[u].size();i++)
{
int v=G[u][i];
if(!visit[v])
{
visit[v]=true;
if(pre[v]==-1||dfs(pre[v]))
{
pre[v]=u;
pre[u]=v;
return true;
}
}
}
return false;
}
int main()
{
memset(pre,-1,sizeof(pre));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
int d;
scanf("%d",&d);
int a=i-d,b=i+d;
if(a<=0) a+=n;
if(b>n) b-=n;
a+=n,b+=n; //与原有的1~n的数字区分开
if(a>b) swap(a,b); //保证a<b,这样邻接表里的边的终点才能是字典序
G[i].push_back(a),G[i].push_back(b);
}
for(int i=n;i>=1;i--) //注意是从后往前做二分图匹配
{
memset(visit,false,sizeof(visit));
if(!dfs(i))
{
printf("No Answer");
return 0;
}
}
for(int i=1;i<n;i++)
printf("%d ",pre[i]-n-1);
printf("%d",pre[n]-n-1);
//printf("\n");
return 0;
}