Объединенные веса «NOIP2014»

Портал
Luogu

Проблема решения идеи

Потому что это дерево, так что в двух точках , если они могут производить совместные веса, то они могут быть сопоставлены только лишь транзитным пунктом, поэтому мы перечислим точку перехода.
Но мы увидим , что, если точки вокруг каждой точки вытаскивать согласования парных, сложность, очевидно , не несет.
Рассмотрим математический вывод:
Для столбцов \ (\ {A_N \} \) , попарные значение приводит общий вес -ий получается как:
\ [\ sum_ {I <J} 2a_ia_j = \ влево (\ sum_ {I = 1.} ^ {п} a_i \ справа) ^
2- \ sum_ {= 1} ^ na_i ^ 2 \] это должно быть очевидно ,Вы полностью квадрат формула не будете делать
Таким образом , мы имеем очень хорошую статистику и максимальное значение, а затем избран также до тех пор , как два крупнейших \ (a_i \) , чтобы соответствовать просто отлично.

Подробности Примечания

  • Эта тема максимальной яма: нет максимального по модулю выхода, и выход к модулю

Код ссылки

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cctype>
#include <cmath>
#include <ctime>
#define rg register
using namespace std;
template < typename T > inline void read(T& s) {
    s = 0; int f = 0; char c = getchar();
    while (!isdigit(c)) f |= c == '-', c = getchar();
    while (isdigit(c)) s = s * 10 + (c ^ 48), c = getchar();
    s = f ? -s : s;
}

const int p = 10007;
const int _ = 200002;

int n, val[_];
int tot, head[_], nxt[_ << 1], ver[_ << 1];
inline void Add_edge(int u, int v)
{ nxt[++tot] = head[u], head[u] = tot, ver[tot] = v; }

int main() {
#ifndef ONLINE_JUDGE
    freopen("in.in", "r", stdin);
#endif
    read(n);
    for (rg int u, v, i = 1; i < n; ++i)
        read(u), read(v), Add_edge(u, v), Add_edge(v, u);
    for (rg int i = 1; i <= n; ++i) read(val[i]);
    int ans1 = 0, ans2 = 0;
    for (rg int u = 1; u <= n; ++u) {
        int mx = 0, _mx = 0, sum1 = 0, sum2 = 0;
        for (rg int i = head[u]; i; i = nxt[i]) {
            int w = val[ver[i]];
            if (w > mx) _mx = mx, mx = w;
            else if (w > _mx) _mx = w;
            sum1 = (sum1 + w) % p;
            sum2 = (sum2 + 1ll * w * w % p) % p;
        }
        ans1 = max(ans1, mx * _mx);
        ans2 = (ans2 + 1ll * sum1 * sum1 - sum2) % p;
    }
    printf("%d %d\n", ans1, ans2 % p);
    return 0;
}

Конец Sahua \ (qwq \)

рекомендация

отwww.cnblogs.com/zsbzsb/p/11771799.html
рекомендация