社区讨论

我好像写了一个非常劣的解法

P1351[NOIP 2014 提高组] 联合权值参与者 3已保存回复 2

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
2 条
当前快照
1 份
快照标识符
@mjfuyeel
此快照首次捕获于
2025/12/21 23:04
2 个月前
此快照最后确认于
2025/12/22 19:16
2 个月前
查看原帖
CPP
#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define ull unsigned long long
constexpr int N = 200005;
constexpr int mod = 10007;
#define push_down(x) for (int t : v[now]) if (t != f) x(t, now)
int Maxn;
unsigned __int128 Ans;
vector <int> v[N], nv[N];
int w[N], fa[N], sum[N], maxn[N], cmax[N];
void ycl1(int now, int f){
    fa[now] = f;
    sum[fa[f]] += w[now],
    maxn[fa[f]] = max(maxn[fa[f]], w[now]);
    push_down(ycl1);
}
void ycl2(int now, int f){
    sum[f] += w[now];
    if (w[now] >= maxn[f]) cmax[f] = maxn[f], maxn[f] = w[now];
    else cmax[f] = max(cmax[f], w[now]);
    push_down(ycl2);
}
void dfs1(int now, int f){
    Ans += (ull)w[now] * sum[now];
    Maxn = max(Maxn, w[now] * maxn[now]);
    push_down(dfs1);
}
void dfs2(int now, int f){
    Ans += (ull)w[now] * (sum[f] - w[now]);
    Maxn = max(Maxn, w[now] * (maxn[f] == w[now] ? cmax[f] : maxn[f]));
    push_down(dfs2);
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    int n; cin >> n;
    for (int i = 1; i < n; ++i){
        int a, b; cin >> a >> b;
        v[a].pb(b), v[b].pb(a);       
    }
    for (int i = 1; i <= n; ++i) cin >> w[i];
    ycl1(1, 0);
    dfs1(1, 0);
    Ans = ((Ans % mod) << 1) % mod;
    memset(sum, 0, sizeof(sum));
    memset(maxn, 0, sizeof (maxn));
    ycl2(1, 0);
    dfs2(1, 0);
    cout << Maxn << ' ' << (ull)(Ans % mod);
}
卡了一下常,213ms通过

回复

2 条回复,欢迎继续交流。

正在加载回复...