这是我的代码
```cpp
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
const int N=11000;
struct node
{
int to;
int next;
};
node e[2*N];
int head[N],ans[N],etot;
void add(int x,int y)
{
etot++;
e[etot].to=y;
e[etot].next=head[x];
head[x]=etot;
}
void read(int &x)
{
int f;
f=1;
x=0;
char c;
c=getchar();
while((c<'0'||c>'9')&&c!='-')
{
c=getchar();
}
if(c=='-')
{
f=-1;
c=getchar();
}
while(c>='0'&&c<='9')
{
x=(x<<3)+(x<<1)+(c^48);
c=getchar();
}
x=x*f;
}
int d[N];
struct node2
{
int fr;
int to;
};
node2 e2[10];
int e2tot,vis[2*N],match[2*N];
bool cmp(const node2& x1,const node2& x2)
{
return x1.fr==x2.fr ? x1.to>x2.to : x1.fr<x2.fr;
}
bool dfs(int x)
{
int i,v;
for(i=head[x];i!=0;i=e[i].next)
{
v=e[i].to;
if(!vis[v])
{
vis[v]=1;
if(!match[v]||dfs(match[v]))
{
match[v]=x;
ans[x]=v;
return 1;
}
}
}
return 0;
}
int main()
{
int n,i,x,y,z,xx,j;
read(n);
for(i=1;i<=n;i++)
{
read(d[i]);
}
for(i=1;i<=n;i++)
{
x=d[i]+(i-1);
e2tot=0;
if(x>=0&&x<=n-1&&x-i+1<=n/2&&x>=i-1)
{
e2tot++;
e2[e2tot].fr=i;
e2[e2tot].to=x+n+1;
}
else
{
x=-1;
}
y=(i-1)-d[i];
if(y>=0&&y<=n-1&&y!=x&&i-1-y<=n/2&&y<=i-1)
{
e2tot++;
e2[e2tot].fr=i;
e2[e2tot].to=y+n+1;
}
else
{
y=-1;
}
z=(i-1)+d[i]-n;
if(z>=0&&z<=n-1&&z!=x&&z!=y&&i-1-z>n/2&&z<=i-1)
{
e2tot++;
e2[e2tot].fr=i;
e2[e2tot].to=z+n+1;
}
else
{
z=-1;
}
xx=n+(i-1)-d[i];
if(xx>=0&&xx<=n-1&&xx!=x&&xx!=y&&xx!=z&&xx-i+1>n/2&&xx>=i-1)
{
e2tot++;
e2[e2tot].fr=i;
e2[e2tot].to=xx+n+1;
}
else
{
xx=-1;
}
sort(e2+1,e2+1+e2tot,cmp);
for(j=1;j<=e2tot;j++)
{
add(e2[j].fr,e2[j].to);
}
}
for(i=n;i>=1;i--)
{
memset(vis,0,sizeof(vis));
vis[i]=1;
if(!dfs(i))
{
printf("No Answer");
return 0;
}
}
for(i=1;i<=n;i++)
{
printf("%d ",ans[i]-1-n);
}
}
```
by szr666 @ 2019-08-24 11:45:32