TLE on #7 求助
查看原帖
TLE on #7 求助
520748
_Ch1F4N_楼主2023/9/6 10:34

如题:

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn = 5e5+114;
const int inf = 1e15+7;
vector<int> edge[maxn],road[maxn];
int top[maxn],son[maxn],sz[maxn],dep[maxn],fa[maxn][21];
int d[maxn][21];
int dfn[maxn],dfncnt;
unordered_map<int,int> w[maxn];
void dfs1(int u,int father){
    dep[u]=dep[father]+1;
    fa[u][0]=father;
    for(int i=1;i<=18;i++) fa[u][i]=fa[fa[u][i-1]][i-1];
    d[u][0]=w[father][u];
    for(int i=1;i<=18;i++) d[u][i]=min(d[u][i-1],d[fa[u][i-1]][i-1]);
    dfn[u]=++dfncnt;
    sz[u]=1;
    for(int v:edge[u]){
        if(v==father) continue;
        dfs1(v,u);
        sz[u]+=sz[v];
        if(sz[v]>sz[son[u]]) son[u]=v;
    }
}
void dfs2(int u,int tp){
    top[u]=tp;
    for(int v:edge[u]){
        if(v==fa[u][0]) continue;
        if(v==son[u]) dfs2(v,tp);
        else dfs2(v,v);
    }
}
int LCA(int u,int v){
    while(top[u]!=top[v]){
        if(dep[top[u]]<dep[top[v]]) swap(u,v);
        u=fa[top[u]][0];
    }
    if(dep[u]<dep[v]) swap(u,v);
    return v;
}
bool cmp(int x,int y){
    return dfn[x]<dfn[y];
}
int dp[maxn];
int lg[maxn];
bool f[maxn];
int Min(int u,int v){
    if(dep[u]<dep[v]) swap(u,v);
    int res=inf;
    while(dep[u]>dep[v]) res=min(res,d[u][0]),u=fa[u][0];
    return res;
}
void dfs3(int u,int father){
    for(int v:road[u]){
        if(v==father) continue;
        dfs3(v,u);
        if(f[v]==true) dp[u]+=Min(u,v);
        else dp[u]+=min(dp[v],Min(u,v));
    }
}
int n,m;
vector<int> vec;
unordered_set<int> s;
signed main(){
    ios::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    cin>>n;
    lg[1]=0;
    for(int i=2;i<=n;i++) lg[i]=lg[i/2]+1;
    for(int i=1;i<n;i++){
        int u,v,val;
        cin>>u>>v>>val;
        edge[u].push_back(v);
        edge[v].push_back(u);
        w[u][v]=w[v][u]=val;
    }
    dfs1(1,0);
    dfs2(1,1);
    cin>>m;
    for(int i=1;i<=m;i++){
        int k;
        cin>>k;
        for(int j=1;j<=k;j++){
            int x;
            cin>>x;
            f[x]=true;
            vec.push_back(x);
            s.insert(x);
        }
        s.insert(1);
        vec.push_back(1);
        sort(vec.begin(),vec.end(),cmp);
        for(int i=0;i<vec.size()-1;i++){
            s.insert(LCA(vec[i],vec[i+1]));
        }
        vec.clear();
        for(int x:s) vec.push_back(x);
        sort(vec.begin(),vec.end(),cmp);
        for(int i=0;i<vec.size()-1;i++){
            if(LCA(vec[i],vec[i+1])!=vec[i+1]) road[LCA(vec[i],vec[i+1])].push_back(vec[i+1]);
        }
        dfs3(1,0);
        cout<<dp[1]<<'\n';
        for(int x:vec) f[x]=false,dp[x]=0,road[x].clear();
        vec.clear();
        s.clear();
    }
    return 0;
}
2023/9/6 10:34
加载中...