
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