求助,为什么会WA一个点的最大值
查看原帖
求助,为什么会WA一个点的最大值
448502
JCLinux楼主2022/1/18 21:46

我的思路和题解思路大致相同,但是要烦琐了一些。 所以结果应该和标程相同才对,但是有一组数据的最大值与答案不同,我想了半天想不到原因出在哪里。

向神犇们求助

烂代码:

#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;
}

2022/1/18 21:46
加载中...