T飞求助
查看原帖
T飞求助
1034667
Elysian_Realme楼主2024/8/2 16:32

洛谷A了,别的站上T飞

#include <bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
    int x=0,f=1;char ch=getchar();
    while (ch<'0'||ch>'9'){if (ch=='-') f=-1;ch=getchar();}
    while (ch>='0'&&ch<='9'){x=x*10+ch-48;ch=getchar();}
    return x*f;
}
inline void print(int x){
    static int s[20],t=0;
    do s[++t]=x%10,x/=10;while(x);
    while(t) putchar(s[t--] + '0');
}
const int N=5e5+5;
struct edge{
    int v,w;
};
int n,k;
int sz[N],sm[N];
int f[N][2],as[N];
int vis[N],son[N];
vector<edge> g[N];
void dfs1(int u,int fa){
    sz[u]=vis[u],sm[u]=0;
    for(edge i:g[u]){
        int v=i.v,w=i.w;
        if(v==fa)continue;
        dfs1(v,u);
        if(sz[v]){
            sm[u]+=sm[v]+(w<<1);
            if(f[v][0]+w>=f[u][0])
                f[u][1]=f[u][0],f[u][0]=f[v][0]+w,son[u]=v;
            else if(f[v][0]+w>f[u][1])
                f[u][1]=f[v][0]+w;
            sz[u]+=sz[v];
        }
    }
}
void dfs2(int u,int fa){
    for(edge i:g[u]){
        int v=i.v,w=i.w;
        if(v==fa)continue;
        if(!sz[v])as[v]=as[u]+(w<<1),f[v][0]=f[u][0]+w;
        else if(sz[v]==k)as[v]=sm[v];
        else{
            as[v]=as[u];
            if(f[u][0]+w>f[v][0]&&v!=son[u])
                f[v][1]=f[v][0],f[v][0]=f[u][0]+w,son[v]=-1;
            else if(f[u][1]+w>f[v][0])
                f[v][1]=f[u][0],f[v][0]=f[u][1]+w,son[v]=-1;
            else if(f[u][0]+w>f[v][1]&&v!=son[u])
                f[v][1]=f[u][0]+w;
            else if(f[u][1]+w>f[v][1])
                f[v][1]=f[u][1]+w;
        }
        dfs2(v,u);
    }
}
signed main(){
    freopen("vol.in","r",stdin);
    freopen("vol.out","w",stdout);
    cin>>n>>k;
    for(int i=1;i<n;i++){
        int u=read(),v=read(),w=read();
        g[u].push_back({v,w});
        g[v].push_back({u,w});
    }
    for(int i=1;i<=k;i++)
        ++vis[read()];
    dfs1(1,0);
    as[1]=sm[1];
    dfs2(1,0);
    for(int i=1;i<=n;i++)
        cout<<as[i]-f[i][0]<<endl;
    return 0;
}
2024/8/2 16:32
加载中...