虚树板子TLE求助
查看原帖
虚树板子TLE求助
341373
Autofreeze楼主2021/1/31 17:44

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);
}
2021/1/31 17:44
加载中...