调了半天,一直MLE ,数组一直开到 1e6 才过。但是为什么要开到 1e6 啊?开两倍不就够了吗。是因为我的写法比较独特吗?
#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int N=1e6+10;
int n,m,stac[N],top,dep[N],f[N][21],query[N],col,dfn[N],b[N];
ll dis[N];
struct node
{
int fi;
ll se;
};
int hd[N],tov[N],nxt[N],cnt;
vector<node> ve[N];
vector<int> ve2[N];
void add(int u,int v){ve2[u].push_back(v);}
void dfss(int u)
{
dfn[u]=++col;
for(int j=1;j<=20;j++)
f[u][j]=f[f[u][j-1]][j-1];
int len=ve[u].size();
for(int i=0;i<len;i++)
{
int v=ve[u][i].fi;
if(dfn[v])continue;
dep[v]=dep[u]+1;
dis[v]=min(dis[u],ve[u][i].se);
f[v][0]=u;
dfss(v);
}
}
int lca(int x,int y)
{
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)
if(dep[f[x][i]]>=dep[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];
}
ll dfs(int u)
{
ll ans=0,jg;
int len=ve2[u].size();
for(int i=0;i<len;i++)
{
int v=ve2[u][i];
ans+=dfs(v);
}
if(query[u])jg=dis[u];
else jg=min(dis[u],ans);
query[u]=0;
ve2[u].clear();
return jg;
}
bool cmp(int x,int y)
{
return dfn[x]<dfn[y];
}
int main()
{
cin>>n;
for(int i=1;i<n;i++)
{
int u,v,w;cin>>u>>v>>w;
ve[u].push_back((node){v,w});
ve[v].push_back((node){u,w});
}
dis[1]=0x3f3f3f3f3f3f3f3f;dep[1]=1;
dfss(1);
//for(int i=1;i<=n;i++)cout<<dis[i]<<'\n';
cin>>m;
for(int i=1;i<=m;i++)
{
int len;cin>>len;
for(int j=1;j<=len;j++)
{
cin>>b[j];query[b[j]]=1;
}
sort(b+1,b+len+1,cmp);
stac[top=1]=b[1];
for(int j=2;j<=len;j++)
{
int lc=lca(b[j],stac[top]);
while(1)
if(dep[lc]>=dep[stac[top-1]])
{
if(lc!=stac[top])
{
add(lc,stac[top]);
if(lc==stac[top-1])top--;
else stac[top]=lc;
}
break;
}
else
{
add(stac[top-1],stac[top]);
top--;
}
stac[++top]=b[j];
}
while(--top)
add(stac[top],stac[top+1]);
cout<<dfs(stac[1])<<'\n';
}
return 0;
}