记录编号 |
166738 |
评测结果 |
AAAAAAAAAA |
题目名称 |
[NOI 2009]变换序列 |
最终得分 |
100 |
用户昵称 |
天一阁 |
是否通过 |
通过 |
代码语言 |
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;
}