AcWing
  • 首页
  • 题库
  • 题解
  • 分享
  • 问答
  • 活动
  • 应用
  • 吐槽
  • 登录/注册

AcWing 511. 联合权值

作者: 作者的头像   楚天 ,  2020-12-03 09:09:41 ,  阅读 19


0


#include <bits/stdc++.h>
using namespace std;
const int N = 400000;
int ne[N], ver[N], idx, head[N];
long long ans;
long long sum;
long long a[N];
int n;
long long res;
const int mod = 10007;
void add(int u, int v) {
  ne[idx] = head[u];
  ver[idx] = v;
  head[u] = idx;
  idx++;
}

void dfs(int x) {
  long long t1 = 0, t2 = 0;
  sum = 0;
  for (int i = head[x]; i != -1; i = ne[i]) {
    int j = ver[i];
    sum = ((sum + a[j]) + mod) % mod;
    if (a[j] > t1) {
      t2 = t1;
      t1 = a[j];
    } else if (a[j] > t2) {
      t2 = a[j];
    }
  }
  ans = max(ans, (long long)t2* t1 );
  for (int i = head[x]; i != -1; i = ne[i]) {
    int j = ver[i];
    res = (res + ((long long)(sum - a[j]) * a[j] % mod) + mod) % mod;
  }
}
int main() {
  memset(head, -1, sizeof(head));
  scanf("%d", &n);
  for (int i = 1; i < n; i++) {
    int a, b;
    scanf("%d%d", &a, &b);
    add(a, b);
    add(b, a);
  }
  for (int i = 1; i <= n; i++) scanf("%lld", &a[i]);
  for (int i = 1; i <= n; i++) {
    dfs(i);
  }
  cout <<ans << ' ' << (res + mod) % mod << endl;
  return 0;
}

0 评论

你确定删除吗?

© 2018-2021 AcWing 版权所有  |  京ICP备17053197号-1
联系我们  |  常见问题
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标
请输入绑定的邮箱地址
请输入注册信息