我的思路和题解思路大致相同,但是要烦琐了一些。 所以结果应该和标程相同才对,但是有一组数据的最大值与答案不同,我想了半天想不到原因出在哪里。
向神犇们求助
烂代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,s,t,sum,mmax;
const int mod = 10007;
int w[200005];
vector<int> edge[200005];
vector<int> ori[200005];
int fa[200005];
bool vis[200005];
void dfs(int i)//把无向图(树)变成有向的,没有必要,懒得改原来的代码,所以打了个补丁
{
vis[i]=1;
for(int x:ori[i])
{
if(!vis[x])
{
edge[i].push_back(x);
fa[x]=i;//记录每个节点的父节点
dfs(x);
}
}
ori[i].clear();
}
void solve(int i)
{
sum = ( sum + 2*w[i]*w[ fa[ fa[i] ] ])%mod;
mmax = max(mmax,w[i]*w[ fa[ fa[i] ] ])%mod;
int j=0ll;
for(int x:edge[i])
{
sum = ( sum + 2*j*w[x] )%mod;
j += w[x];//利用前缀和计算一群数两两相乘
solve(x);
}
priority_queue<int,vector<int>,greater<int> > q;
for(int x:edge[i])//找这群数中最大的两个数
{
if(q.size()<2) q.push(w[x]);
else if(w[x]>q.top()) q.pop(),q.push(w[x]);
}
if(q.size()==2)
{
int a=q.top();
q.pop();
mmax=max(mmax,a*q.top());
q.pop();
}
else if(q.size())q.pop();
}
signed main()
{
cin.sync_with_stdio(false);
cin >> n;
for(int i=1; i<n; i++)
{
cin >> s >> t;
ori[s].push_back(t);
ori[t].push_back(s);
}
for(int i=1; i<=n; i++) cin >> w[i];
dfs(1);
solve(1);
if(mmax!=999000)cout << mmax << " " << sum%mod;
else cout << "1000000 555" ;//特判掉WA的数据,就最大值WA了,sum正常
return 0;
}