读懂题就会做系列(我也不一定会吧 (滑稽
有样例解释
相信就懂了
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
int n;
int Link[20010],vis[20010];
struct edge {
int v,next;
}e[40010];
int cnt,head[20010];
int read_int () {
char c = getchar();
int re = 0;
for(;c > '9' || c < '0';c = getchar());
for(;c >= '0' && c <= '9';c = getchar())
re = re * 10 + c - '0';
return re;
}
void adde (int u,int v) {
e[++cnt].v = v;
e[cnt].next = head[u];
head[u] = cnt;
}
int find (int u,int flg) {
for(int i = head[u];i != -1;i = e[i].next) {
int v = e[i].v;
if(vis[v] == flg)
continue;
vis[v] = flg;
if(Link[v] == -1 || find(Link[v],flg)) {
Link[v] = u;
Link[u] = v;
return 1;
}
}
return 0;
}
int main () {
memset(head,-1,sizeof head);
memset(Link,-1,sizeof Link);
n = read_int();
for(int i = 0;i <= n - 1;++i) {
int t = read_int();
int t1 = min((i + t) % n,(i - t + n) % n);
t = max((i + t) % n,(i - t + n) % n);
adde(n + i,t);
adde(n + i,t1);
}
int cc = 0;
for(int i = n - 1;i >= 0;--i) {
if(Link[i + n] == -1) {
if(!find(i + n,++cc)) {
printf("No Answer\n");
return 0;
}
}
}
printf("%d",Link[n]);
for(int i = n + 1;i <= 2 * n - 1;++i) {
printf(" %d",Link[i]);
}
printf("\n");
}