#992. CSP 2020 第一轮(初赛)模拟 第 34 题

CSP 2020 第一轮(初赛)模拟 第 34 题

(封禁 xxs)现有 nn 个 xxs(编号为 11nn),每个 xxs 都有一个关注者,第 ii 个 xxs 的关注者是 aia_i。现在管理员要将其中的一些 xxs 的账号封禁,但需要注意的是如果封禁了第 ii 个人,那么为了不打草惊蛇,就不能封禁他的关注者 aia_i。现在想知道最多可以封禁多少个 xxs。

输入第一行是一个不超过 300000300000 的整数 nn,第二行是 nn11nn 的整数表示 aia_i

输出一行,一个整数表示答案。

#include <cstdio>
using namespace std;
#define MAXN 300005
int n, ans = 0, a[MAXN], in[MAXN] = {0};
bool vis[MAXN] = {0};
void dfs(int cur, int w) {
    if(vis[cur])
        return;
    vis[cur] = true;
    if(w == 1) ans++;
    ①
    if(②)
        dfs(a[cur], ③);
}
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
        scanf("%d", &a[i]);
        in[a[i]]++;
    }
    for(int i = 1; i <= n; i++)
        if(!in[i]) ④;
    for(int i = 1; i <= n; i++)
        if(⑤) dfs(i, 0);
    printf("%d\n", ans);
    return 0;
}
 

{{ select(1) }}

  • a[cur]=cur;
  • in[a[cur]]=0;
  • in[a[cur]]--;
  • in[cur]--;