求助灵异事件

#include <bits/stdc++.h>
using namespace std;
#define N 1000005
#define INF INT_MAX
int n, a[N], to[N], root;
int f[N][0], vis[N];
vector<int> g[N];
void dfs(int u) {
    f[u][0] = f[u][1] = 0;
    vis[u] = 1;
    int k = -INF;
    if (!g[u].size() || g[u][0] == root) k = 0;
    for (auto v : g[u]) {
        if (vis[v]) continue;
        dfs(v);
        int t = max(f[v][0], f[v][1]);

        cout << f[v][0] << " ";

        f[u][0] += t;
        
        cout << f[v][0] << "\n";

        k = max(k, f[v][0] - t);
    }
    f[u][1] = f[u][0] + 1 + k;
    return;
}
int main() {
    cin >> n;
    for (int i = 1; i <= n; i++){
        cin >> a[i];
        g[a[i]].push_back(i);
    }
    for (int i = 1; i <= n; i++)
        if (!vis[i]) {
            root = i;
            dfs(i);
        }
    return 0;
}

代码是这样的,未写完,不过可以看到我在dfs中的调试语句。
如果我使用这组样例。

9
8 1 2 2 1 5 6 6 3

则调试会输出

0 1
1 3
0 1
1 4
0 1
0 1
1 3
3 8

也就是说,在

cout << f[v][0] << " ";
f[u][0] += t;
cout << f[v][0] << "\n";

中,中间的代码导致了 f_{v,0} 的变化。
不知道怎么回事。

临沂时间

啥意思/yun

问,为什么我输出是这样的??
0 1
1 3
0 1
1 4
0 1
0 0
0 1
1 3

那不知道

你的u==v了

你输出u和v试试

不是的

发现问题了,f 数组定义有问题/xk

我知道了,你的f数组定义就错了

呃呃呃,好像慢了

能给我解决方案么? @李依霄1