题意:
有 n n n 个人,互相送礼物,每个人必须收到 1 1 1 个礼物且送出 1 1 1个礼物,现在把没有送出礼物的人帮忙把他的礼物给送出去。
先把没有送出礼物的人的位置给记录下来,然后再把没有收到礼物的人给记录下来,这两个数量肯定是相等的,所以我们对每个位置进行遍历,如果位置相同就变换位置,最后把没有送出的赋值即可。
AC代码:
const int N = 2e5 + 10;
int n, m;
int ans, res, tmp, cnt;
int a[N];
bool vis[N];
vector<int> v, pos;
int x, y;
int main()
{
sd(n);
mem(vis, 0);
rep(i, 1, n)
{
sd(a[i]);
vis[a[i]] = 1;
}
cnt = 0;
rep(i, 1, n)
{
if (!a[i])
pos.pb(i);
if (!vis[i])
v.pb(i);
}
m = pos.size();
rep(i, 0, m - 1)
{
if (pos[i] == v[i])
{
x = i;
y = (i + 1) % m;
swap(v[x], v[y]);
}
}
rep(i, 0, m - 1)
a[pos[i]] = v[i];
rep(i, 1, n)
printf("%d%c", a[i], i == n ? '\n' : ' ');
return 0;
}