Hello, PastePlz!

Paste Time: 2024-02-14 22:20:33.323932485 +08:00:00
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>

#define int long long
#define N 200010

int T, n;
int nx[N];
int ru[N];
std::vector<int> g[N];

bool check(int x) {
    return 1 <= x && x <= n;
}

int dep[N], idx, id[N], cnt[N], sum;
bool vis[N];
int siz[N];

void dfs(int k, int deep) {
    siz[k] = 1;
    vis[k] = 1;
    dep[k] = deep;
    id[k] = idx;
    cnt[idx]++;//联通块大小
    sum++;
    int sz = g[k].size();
    for (int i = 0; i < sz; i++) {
        int p = g[k][i];
        dfs(p, deep + 1);
        siz[k] += siz[p];
    }
}

signed main() {
    scanf("%lld", &T);
    while (T--) {
        scanf("%lld", &n);
        for (int i = 1; i <= n; i++) {
            scanf("%lld", &nx[i]);
            nx[i] += i;
            if (check(nx[i])) {
                ru[i]++;
                g[nx[i]].push_back(i);
            }
        }
        for (int i = 1; i <= n; i++) {
            if (!ru[i]) {
                idx++;
                dfs(i, 1);//dfs了所有的树
            }
        }
        for (int i = 1; i <= n; i++)
            vis[i] = 0;
        if (id[1])
            sum -= cnt[id[1]];
        int p = 1, ans = 0;
        while (check(p) && !vis[p]) {
            vis[p] = 1;
            ans += n + 1;
            if (id[1])
                ans += cnt[id[1]] - siz[p];
            ans += sum;
            p = nx[p];
        }
        for (int i = 1; i <= n; i++)
            if (id[1] && !vis[i])
                ans += 2 * n + 1;
        printf("%lld\n", ans);
        for (int i = 1; i <= n; i++) {
            vis[i] = 0;
            id[i] = 0;
            cnt[i] = 0;
            dep[i] = 0;
            ru[i] = 0;
            g[i].clear();
        }
        idx = sum = 0;
    }
}