题目链接:BZOJ 1562
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 10000 + 10;
int N;
bool vis[2 * maxn];
int head[2 * maxn], belong[2 * maxn], choose[2 * maxn], d[10];
struct node{
int v, next;
}e[100000];
inline int read(){
int x = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9'){if(ch == '-')f = -1; ch = getchar();}
while(ch >= '0' && ch <= '9'){x = x * 10 + ch - '0'; ch = getchar();}
return x * f;
}
bool cmp(int x, int y){
return x > y;
}
int k = 0;
void adde(int u, int v){
e[k].v = v; e[k].next = head[u]; head[u] = k++;
}
void input(){
memset(head, -1, sizeof(head));
N = read();
for(int i = 0; i < N; ++i){
int x = read(); int y = N - x;
d[0] = i - x; d[1] = i + x; d[2] = i - y; d[3] = i + y;
sort(d, d + 4, cmp);
for(int j = 0; j < 4; ++j){
if(d[j] < 0 || d[j] >= N)continue;
adde(i, d[j] + N);
}
}
}
bool find(int u){
for(int i = head[u]; i != -1; i = e[i].next){
int v = e[i].v;
if(!vis[v]){
vis[v] = 1;
if(!belong[v] || find(belong[v])){
belong[v] = u; return true;
}
}
}
return false;
}
void solve(){
int ans = 0;
for(int i = N - 1; i >= 0; --i){
memset(vis, 0, sizeof(vis));
if(find(i))ans ++;
}
if(ans == N){
for(int i = N; i < 2 * N; ++i){
choose[belong[i]] = i - N;
}
for(int i = 0; i < N; ++i){
if(i != 0)printf(" ");
printf("%d", choose[i]);
}
}
else{
printf("No Answer");
}
}
int main(){
input();
solve();
return 0;
}