RT,只有前两个点 AC 了,后面全都 TLE /kk
屑代码
#include<bits/stdc++.h>
#define N 301001
#define MAX 301
#define re register
#define inf 1e18
using namespace std;
typedef long long ll;
typedef double db;
const ll mod=1000000007;
inline void read(re ll &ret)
{
ret=0;re char c=getchar();re bool pd=false;
while(!isdigit(c)){pd|=c=='-';c=getchar();}
while(isdigit(c)){ret=(ret<<1)+(ret<<3)+(c&15);c=getchar();}
ret=pd?-ret:ret;
return;
}
ll n,a,b,c,dfn[N],cnt,dep[N],f[N][21],d[N],m,k,s[N],head,lis[N],tot,dp[N];
vector<pair<ll,ll> >v[N];
vector<ll>g,t[N];
inline bool cmp(re ll x,re ll y)
{
return dfn[x]<dfn[y];
}
inline void dfs(re ll ver,re ll fa,re ll dis)
{
dfn[ver]=++cnt;
dep[ver]=dep[fa]+1;
f[ver][0]=fa;
for(re int i=1;i<=20;i++)
f[ver][i]=f[f[ver][i-1]][i-1];
if(fa^1)
d[ver]=min(d[fa],dis);
else
d[ver]=dis;
for(re int i=0;i<v[ver].size();i++)
{
re ll to=v[ver][i].first,w=v[ver][i].second;
if(to==fa)
continue;
dfs(to,ver,w);
}
return;
}
bool vis[N];
inline ll lca(re ll p,re ll q)
{
if(dep[p]<dep[q])
swap(p,q);
re ll d=dep[p]-dep[q];
for(re int i=0;i<=20;i++)
if((1<<i)&d)
p=f[p][i];
if(p==q)
return p;
for(re int i=20;i+1;i--)
{
if(f[p][i]^f[q][i])
{
p=f[p][i];
q=f[q][i];
}
}
return f[p][0];
}
inline void df5(re ll ver,re ll fa)
{
dp[ver]=d[ver];
if(ver==1)
dp[ver]=inf;
if(t[ver].size()==1&&ver!=1)
{
if(!vis[ver])
dp[ver]=0;
return;
}
re ll tmp=0;
for(re int i=0;i<t[ver].size();i++)
{
re ll to=t[ver][i];
if(to==fa)
continue;
df5(to,ver);
tmp+=dp[to];
}
if(!vis[ver])
dp[ver]=min(dp[ver],tmp);
return;
}
signed main()
{
read(n);
for(re int i=1;i<n;i++)
{
read(a);
read(b);
read(c);
v[a].push_back(make_pair(b,c));
v[b].push_back(make_pair(a,c));
}
dfs(1,0,0);
read(m);
for(re int i=1;i<=m;i++)
{
read(k);
g.clear();
for(re int j=1;j<=k;j++)
{
re ll tmp;
read(tmp);
g.push_back(tmp);
}
sort(g.begin(),g.end(),cmp);
head=0;
s[++head]=1;
lis[++tot]=1;
for(re int j=0;j<g.size();j++)
{
re ll now=g[j];
vis[now]=true;
re ll tmp=lca(s[head],now);
if(head==1)
s[++head]=now,lis[++tot]=now;
else
{
while(head>1&&dfn[s[head-1]]>=dfn[tmp])
{
t[s[head-1]].push_back(s[head]);
t[s[head]].push_back(s[head-1]);
head--;
}
if(s[head]!=tmp)
{
t[tmp].push_back(s[head]);
t[s[head]].push_back(tmp);
s[head]=tmp;
lis[++tot]=tmp;
}
s[++head]=now,lis[++tot]=now;
}
}
while(head>0)
t[s[head]].push_back(s[head-1]),t[s[head-1]].push_back(s[head]),head--;
df5(1,0);
printf("%lld\n",dp[1]);
for(re int j=0;j<g.size();j++)
vis[g[j]]=false;
for(re int j=1;j<=tot;j++)
t[lis[j]].clear();
}
exit(0);
}