1 条题解
-
0
乘积的结果一定也是 或者 或者 形式。
要比较每个结点之间的大小,只需要比较指数的大小即可。 其中需要处理负数和 的情况
所以对于每个结点来说,要比较大小需要保存3个东西
- 以该结点为根结点的子树中,所有指数的和。
- 以该结点为根结点的子树中,负数的个数。
- 以该结点为根结点的子树中,是否有 存在。
如果子树中有0存在,那么结果为0。 否则计算指数的值:负数的数量为奇数时结果是负数,为偶数时结果是正数。指数之和表示值的大小。
这些都可以在遍历树的过程中计算出。
#include<bits/stdc++.h> using namespace std; typedef long long LL; typedef pair<int, int> PII; #define x first #define y second const int N = 1e5 + 10, mod = 1e9 + 7; int n; vector<int> v[N]; int a[N]; int cnt[N], sum[N]; // 负数的数量,指数的总和 bool zero[N]; int digit(int x) { int ans = 0; while(x) { x /= 10; ans ++; } return ans - 1; } void dfs(int u) { for(auto i: v[u]) { dfs(i); if(zero[i]) zero[u] = 1; cnt[u] += cnt[i]; sum[u] += sum[i]; } int t = digit(a[u]); if(t == -1) zero[u] = 1; else { sum[u] += digit(a[u]); if(a[u] < 0) cnt[u] ++; } } void solve() { int n; cin >> n; for(int i = 2; i <= n; i ++) { int x; cin >> x; v[x].push_back(i); } for(int i = 1; i <= n; i ++) cin >> a[i]; dfs(1); int x = -1e9, idx = 0; for(int i = 1; i <= n; i ++) { int v = zero[i] ? 0 : sum[i]; if(cnt[i] & 1) v = -v; if(v > x) { x = v; idx = i; } } cout << idx << endl; } int main() { int t = 1; // scanf("%d", &t); while(t --) solve(); }
- 1
信息
- ID
- 397
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 9
- 标签
- 递交数
- 19
- 已通过
- 4
- 上传者