1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53
|
#include<cstdio> #include<cstdlib> #include<cmath> #include<cstring> #include<algorithm> #define rep(i,x,y) for(register int i=x;i<=y;++i) #define repd(i,x,y) for(register int i=x;i>=y;--i) #define ll long long using namespace std; const int N=1e5; struct { int v,nxt; inline void init(int a,int b){v=a;nxt=b;} }e[N]; int mark[N],n,vis[N],head[N],cnt,ans;
inline int solve(int x){if(x<0)x+=n; if(x>n-1)x-=n; return x+n;}
void add(int u,int x){ int v1=solve(u+x),v2=solve(u-x); if(v1<v2)swap(v1,v2); e[++cnt].init(v1,head[u]);head[u]=cnt; e[++cnt].init(v2,head[u]);head[u]=cnt; }
int find(int x){ vis[x]=1; for(int i=head[x],v;i;i=e[i].nxt)if(!vis[v=e[i].v]){ vis[v]=1; if(!mark[v]||find(mark[v])){ mark[v]=x;mark[x]=v; return 1; } } return 0; }
int r(){ repd(i,n-1,0)if(!mark[i]){ memset(vis,0,sizeof(vis)); ans+=find(i); } return ans==n; }
int main(){ scanf("%d",&n); rep(i,0,n-1){int x;scanf("%d",&x); add(i,x);} if(r())rep(i,0,n-1)printf("%d ",mark[i]-n); else puts("No Answer"); return 0; }
|
近期评论