记录编号 166738 评测结果 AAAAAAAAAA
题目名称 [NOI 2009]变换序列 最终得分 100
用户昵称 Gravatar天一阁 是否通过 通过
代码语言 C++ 运行时间 0.028 s
提交时间 2015-06-16 11:14:05 内存使用 1.38 MiB
显示代码纯文本
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <bitset>
#include <vector>

#define N 20010

using namespace std;

struct edge{
	int x,to;
}E[N<<2];

int n,a[N],pre[N],totE,g[N];
bitset<N> v;
vector<int> G[N];

#define p G[x][i]

void ade(int x,int y){
	G[x].push_back(y);
}

int find(int x){
	v[x]=1;
	int len=G[x].size();
	for(int i=0;i<len;i++)
		if(!v[p]){
			v[p]=1;
			if(!pre[p]||find(pre[p])){
				pre[p]=x; pre[x]=p;
				return 1;
			}
		}
	return 0;
}

int main(){
	freopen("transform.in","r",stdin);
	freopen("transform.out","w",stdout);
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=n;i++){
		if(i-a[i]>=1) G[i].push_back(n+i-a[i]);
		else G[i].push_back(n+i-a[i]+n);
		if(i+a[i]<=n) G[i].push_back(n+i+a[i]);
		else G[i].push_back(i+a[i]);
	}
	for(int i=1;i<=n;i++) sort(G[i].begin(),G[i].end());
	int ans=0;
	for(int i=n;i>=1;i--){
		v.reset();
		if(find(i)) ans++;
	}
	if(ans!=n){
		puts("No Answer");
	}
	else{
		for(int i=1;i<n;i++) printf("%d ",pre[i]-n-1);
		printf("%d\n",pre[n]-n-1);
	}
	return 0;
}