萌新求助简单slopetrick题
查看原帖
萌新求助简单slopetrick题
455490
Sharpsmile楼主2024/10/10 13:14

自己胡的,但是貌似会出现比答案小的情况?想了一下没搞懂做法哪里有问题。大佬帮帮qwq

#include <bits/stdc++.h>
using namespace std;
#define int long long
// #define double long double
int n,m;
int l[600400],r[600400],w[600400];
int c[600400];
inline int f(int u,int x){
    if(x>r[u])return w[u]+x-r[u];
    else if(x<l[u])return w[u]+l[u]-x;
    else return w[u];
}
vector<int>g[600400];
inline void dfs(int u){
    priority_queue<int,vector<int>,greater<int>>q;
    int ct=0;
    for(int v:g[u]){
        dfs(v);
        q.push(l[v]);
        q.push(r[v]);
        ct++;
    }
    if(!q.empty()){
        while(--ct)q.pop();
        l[u]=q.top();
        q.pop();
        r[u]=q.top();
        for(int v:g[u])w[u]+=f(v,l[u]);
    }
    l[u]+=c[u],r[u]+=c[u];
    // cout<<u<<" "<<l[u]<<" "<<r[u]<<" "<<w[u]<<endl;
}
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0),cout.tie(0);
    // int C=clock();
    // freopen("genshin.in","r",stdin);
    // freopen("genshin.out","w",stdout);
    cin>>n>>m;
    for(int i=2;i<=n+m;i++){
        int p;
        cin>>p>>c[i];
        // cout<<p<<" "<<i<<" "<<c[i]<<endl;
        g[p].push_back(i);
    }
    dfs(1);
    cout<<w[1]<<endl;
    cout.flush();
    return 0;
}
2024/10/10 13:14
加载中...