



30%的数据中N≤50;
60%的数据中N≤500;
100%的数据中N≤10000。
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#define MAXN 10010
using namespace std;
int n,T,c=1;
int head[MAXN],val[MAXN],f[MAXN],g[MAXN],vis[MAXN],map[MAXN][2];
inline int read(){
int date=0,w=1;char c=0;
while(c<‘0‘||c>‘9‘){if(c==‘-‘)w=-1;c=getchar();}
while(c>=‘0‘&&c<=‘9‘){date=date*10+c-‘0‘;c=getchar();}
return date*w;
}
bool find(int x){
for(int k=0;k<=1;k++){
if(vis[map[x][k]]==T)continue;
int v=map[x][k];
vis[v]=T;
if(f[v]==-1||find(f[v])){
f[v]=x;g[x]=v;
return true;
}
}
return false;
}
void work(){
T=1;
for(int i=n-1;i>=0;i--){
if(!find(i)){
printf("No Answer");
return;
}
T++;
}
for(int i=0;i<n-1;i++)printf("%d ",g[i]);
printf("%d",g[n-1]);
}
void init(){
int u,v,w;
n=read();
memset(f,-1,sizeof(f));
for(int i=0;i<n;i++){
w=read();
u=(i-w+n)%n;v=(i+w)%n;
if(u>v)swap(u,v);
map[i][0]=u;map[i][1]=v;
}
}
int main(){
init();
work();
return 0;
}
原文:https://www.cnblogs.com/Yangrui-Blog/p/9691654.html