虚树90分求助
查看原帖
虚树90分求助
448483
honghaojin楼主2024/3/6 14:05

TLE1个点

#include<bits/stdc++.h>
using namespace std;
const int N=2.5e5+10;
struct Graph{
	int cnt,hd[N],to[N<<1],wt[N<<1],nt[N<<1];
	void add(int u,int v,int w){
		to[++cnt]=v,wt[cnt]=w,nt[cnt]=hd[u],hd[u]=cnt;
	}
}t,vt;

int cnt,dfn[N],fa[N],dep[N],sz[N],son[N],top[N],a[N];
void dfs(int u){
	for(int e=t.hd[u];e;e=t.nt[e]){
		int v=t.to[e];
		if(v==fa[u])continue;
		a[v]=min(a[u],t.wt[e]);
		fa[v]=u,dep[v]=dep[u]+1;
		dfs(v),sz[u]+=sz[v];
		if(sz[v]>sz[son[u]])son[u]=v;
	}
}
void init(int u){
	dfn[u]=++cnt;
	if(son[u]){
		int v=son[u];
		top[v]=top[u],init(v);
	}
	for(int e=t.hd[u];e;e=t.nt[e]){
		int v=t.to[e];
		if(dfn[v])continue;
		top[v]=v,init(v);
	}
}
int lca(int u,int v){
	while(top[u]!=top[v]){
		if(dep[top[u]]>dep[top[v]])u=fa[top[u]];
		else v=fa[top[v]];
	}
	return dep[u]<dep[v]?u:v;
}

int h[N],h1[N<<1];
bitset<N>tag;
bool cmp(int x,int y){
	return dfn[x]<dfn[y];
}
void build_vt(int n){
	vt.cnt=0;
	sort(h+1,h+n+1,cmp);
	int m=0;
	for(int i=1;i<n;++i){
		h1[++m]=h[i],vt.hd[h1[m]]=0;
		h1[++m]=lca(h[i],h[i+1]),vt.hd[h1[m]]=0;
	}
	h1[++m]=h[n],vt.hd[h1[m]]=0;
	sort(h1+1,h1+m+1,cmp);
	m=unique(h1+1,h1+m+1)-h1-1;
	for(int i=1;i<m;++i){
		vt.add(lca(h1[i],h1[i+1]),h1[i+1],0);
	}
}
long long solve(int u){
	long long ans=0;
	for(int e=vt.hd[u];e;e=vt.nt[e]){
		int v=vt.to[e];
		if(v==fa[u])continue;
		if(tag[v])ans+=a[v];
		else ans+=min(solve(v),(long long)a[v]);
	}
	return ans;
}

signed main(){
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	int n;
	cin>>n;
	for(int i=1;i<n;++i){
		int u,v,w;
		cin>>u>>v>>w;
		t.add(u,v,w),t.add(v,u,w);
	}
	a[1]=114514,dfs(1),init(1);
	int m;cin>>m;
	while(m--){
		int k;
		cin>>k;
		for(int i=1;i<=k;++i){
			cin>>h[i],tag[h[i]]=1;
		}
		h[++k]=1,build_vt(k);
		cout<<solve(1)<<endl;
		for(int i=1;i<=k;++i){
			tag[h[i]]=0;
		}
	}
	return 0;
}
2024/3/6 14:05
加载中...