社区讨论
我好像写了一个非常劣的解法
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 条回复,欢迎继续交流。
正在加载回复...