//使用 upper_bound 来找到第一个大于等于Ai的值的下标 //由于pre数组的数据下标从1开始,所以实际的前缀长度需要 -1 int p = upper_bound(pre + 1, pre + 1 + cnt, prefixS) - pre - 1; //由于需要的是第一个不大于Ai的值,找到的是第一个大于Ai的值,所以需要再多减 1 ans[k] = p - 1;
for (int i = 0; i < TO[k].size(); i++) { int v = TO[k][i]; if (v == fa) continue; dfs(v, k, prefixS + A[k][i], prefixSb + B[k][i]); } //从前缀数组中将该边的影响移除 cnt--; }
intmain(){ int T; scanf("%d", &T); while (T--) { /* 初始化,这里的N为上一个测试用例中N的值 因为一共N个节点,所以上一次始点的最大值为N 这里的始点表示 edge[u][v] 中的 u */ for (int i = 0; i <= N; i++) { A[i].clear(); B[i].clear(); TO[i].clear(); } read(N); cnt = 0;
for (int i = 2; i <= N; i++) { int p, a, b; read(p);read(a);read(b); add_edge(i, p, a, b); add_edge(p, i, a, b); }
dfs(1, -1, 0, 0);
for (int i = 2; i <= N; i++) { printf("%d ", ans[i]); } putchar('\n'); } return0; }