【题目链接】http://www.lydsy.com/JudgeOnline/problem.php?id=1562
【解题思路】%byvoid https://www.byvoid.com/blog/noi-2009-transform/
【呆马(贪心+dfs)】
#include<cstdio>
#include<algorithm>
#include<cmath>
#include<cstdlib>
#include<iostream>
const int N=1e4+1;
using namespace std;
struct st{int to,next;} e[N<<1];
int n,cnt,i,x,he,ta,a[N],b[N],fi[N],fr1[N],fr2[N],ans[N],d[N],g[N];
bool vis[N],u[N];
void add(int x,int y){e[++cnt].to=y; e[cnt].next=fi[x]; fi[x]=cnt;}
void dfs(int x,int y)
{
if (!y)
{
vis[x]=1;
if (!u[a[x]]){ans[x]=a[x];dfs(a[x],1);}
else if (!u[b[x]]){ans[x]=b[x];dfs(b[x],1);}
else{printf("No Answer");exit(0);}
}
else
{
u[x]=1;
if (!vis[fr1[x]]) dfs(fr1[x],0);
else if (!vis[fr2[x]]) dfs(fr2[x],0);
}
}
int main()
{
scanf("%d\n",&n);
for (i=0;i<n;i++)
{
scanf("%d",&x);
d[a[i]=i-x>=0?i-x:i+n-x]++;
d[b[i]=i+x<n?i+x:i-n+x]++;
if (a[i]>b[i]) swap(a[i],b[i]);
add(a[i],i);
add(b[i],i);
}
for (i=0;i<n;i++)
if (d[i]==1) g[++ta]=i;
for (he=1;he<=ta;he++)
{
for (int i=fi[g[he]];i;i=e[i].next)
if (!vis[e[i].to]){x=e[i].to;break;}
vis[x]=u[ans[x]=g[he]]=1;
if (--d[a[x]]==1) g[++ta]=a[x];
if (--d[b[x]]==1) g[++ta]=b[x];
}
for (i=0;i<n;i++)
if (!vis[i])
{
if (fr1[a[i]]) fr2[a[i]]=i;
else fr1[a[i]]=i;
if (fr1[b[i]]) fr2[b[i]]=i;
else fr1[b[i]]=i;
}
for (i=0;i<n;i++)
if (!vis[i]) dfs(i,0);
printf("%d",ans[0]);
for (i=1;i<n;i++) printf(" %d",ans[i]);
}