求助,wa#1+一堆TLE
查看原帖
求助,wa#1+一堆TLE
151647
sycqwq楼主2022/2/5 17:44

rt

TLE啥的应该是我人傻常数大

#include<bits/stdc++.h>
#define int long long
using namespace std;
const int maxn=5e5+5;
int k,n,m,tot,head[maxn],f[maxn][25],dfn[maxn],de[maxn],mi[maxn],b[maxn],dp[maxn],tp[maxn];
vector<int> g[maxn];
struct node
{
    int v,nxt,w;
}e[maxn<<1];
void add(int x,int y,int w)
{
    e[++tot].v=y;
    e[tot].nxt=head[x];
    head[x]=tot;
    e[tot].w=w;
}
void dfs(int x,int fa)
{
    dfn[x]=++tot;
    de[x]=de[fa]+1;
    f[x][0]=fa;
    for(int i=head[x];i;i=e[i].nxt)
    {
        int v=e[i].v;
        if(v!=fa)
        {
            mi[v]=min(mi[x],e[i].w);
            dfs(v,x);
        }
    }
}
void pre()
{
    memset(mi,0x7f,sizeof mi);
    dfs(1,1);
    for(int i=1;i<=20;i++)
        for(int j=1;j<=n;j++)
            f[j][i]=f[f[j][i-1]][i-1];
    // cout<<"FUCKCCF"<<mi[7]<<endl;
}
int lca(int x,int y)
{
    if(de[x]<de[y])
        swap(x,y);
    for(int i=20;i>=0;i--)
        if(de[f[x][i]]>=de[y])
        {
            x=f[x][i];
        }
    if(x==y)    
        return x;
    for(int i=20;i>=0;i--)
        if(f[x][i]!=f[y][i])
            x=f[x][i],y=f[y][i];
    return f[x][0];
}
int cmp(int s1,int s2)
{
    return dfn[s1]<dfn[s2];
}
int q[maxn],top,bk[maxn];
void build()
{
    memset(bk,0,sizeof bk);
    top=0;
    q[++top]=1;
    for(int i=1;i<=k;i++)
    {
        if(b[i]!=1)
        {
            int l=lca(b[i],q[top]);
            // cout<<"QWQ"<<b[i]<<' '<<q[top]<<"lca:"<<l<<endl;
            if(l!=q[top])
            {
                while(dfn[q[top-1]]>dfn[l])
                {
                    if(!bk[q[top-1]])
                    {
                        bk[q[top-1]]=1;
                        g[q[top-1]].clear();
                    }
                    g[q[top-1]].push_back(q[top]),--top;
                }
                if(q[top-1]!=l)
                { 
                    if(!bk[q[top-1]])
                    {
                        bk[q[top-1]]=1;
                        g[q[top-1]].clear();
                    }
                    g[q[top-1]].push_back(q[top]),q[top]=l;
                }
                else
                {
                
                    if(!bk[l])
                    {
                        bk[l]=1;
                        g[l].clear();
                    }
                    g[l].push_back(q[top--]);
                }
            }
            q[++top]=b[i];
        }
    }
    for(int i=1;i<top;i++)
    {
        // cout<<q[i]<<endl;
        if(!bk[q[i]])
        {
            bk[q[i]]=1;
            g[q[i]].clear();
        }
        g[q[i]].push_back(q[i+1]);
    }
}
void solve(int x)
{
    if(!bk[x])
    {
        bk[x]=1;
        g[x].clear();
    }
    int sum=0;
    for(int i=0;i<g[x].size();i++)
    {
        int v=g[x][i];
        // cout<<"###"<<x<<' '<<v<<endl;
        solve(v);
        sum+=dp[v];
    }
    if(tp[x])
    {
        dp[x]=mi[x];
        return;
    }
    if(sum)
        dp[x]=min(sum,mi[x]);
    else
        dp[x]=mi[x];
    // cout<<"####"<<x<<' '<<mi[x]<<' '<<sum<<endl;
    return;
}
signed main()
{
    cin>>n;
    for(int i=1;i<n;i++)
    {
        int x,y,w;
        cin>>x>>y>>w;
        add(x,y,w);
        add(y,x,w);
    }
    pre();
    cin>>m;
    for(int i=1;i<=m;i++)
    {

        // int k;
        memset(tp,0,sizeof tp);
        memset(dp,0x7f,sizeof dp);
        cin>>k;
        for(int j=1;j<=k;j++)
        {
            cin>>b[j];
            tp[b[j]]=1;
        }
        sort(b+1,b+k+1,cmp);
        // g.clear();
        build();
        solve(1);
        cout<<dp[1]<<endl;
    }
    return 0;
}
/*
10
1 5 13
1 9 6
2 1 19
2 4 8
2 3 91
5 6 8
7 5 4
7 8 31
10 7 9
1
4 2 5 9 10
*/

2022/2/5 17:44
加载中...