题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6409
题目不太好复制
#pragma GCC optimize(2) #include<stdio.h> #include<algorithm> #include<string.h> #include<queue> using namespace std; const int maxn = 1e5 + 10; const int inf = 0x3f3f3f3f; typedef long long ll; int t, n, tot, pos; int a[maxn], b[maxn]; vector<int>veb[maxn]; int main() { //freopen("C://input.txt", "r", stdin); scanf("%d", &t); for (int i = 0; i < t; i++) { scanf("%d", &n); for (int i = 2; i <= n; i++) scanf("%d", &a[i]); for (int i = 1; i <= n; i++) scanf("%d", &b[i]); for (int i = 0; i <= n; i++) { veb[i].clear(); } for (int i = 1; i <= n; i++) veb[a[i]].push_back(b[i]); long long _max = 0, _min = 0; int _max1 = 0; int _min1 = inf; for (int j = 0; j <= n; j++) { int c = 0, d = inf; for (int i = 0; i < veb[j].size(); i++) { if (veb[j][i] > c) _max1 = max(_max1, c), c = veb[j][i]; //c是最大的 ,_max1是次大 else _max1 = max(_max1, veb[j][i]); if (veb[j][i] < d) //d是最小值 _min1是次小值 _min1 = min(_min1, d), d = veb[j][i]; else _min1 = min(_min1, veb[j][i]); } _max += max(0, c); _min += min(0, d); } printf("%I64d %I64d\n", _max + max(0, _max1), _min + min(0, _min1)); //最大值和加上次大值 最小值和加上次小值 } return 0; }