玄关:可(very)爱(long)代码求条
查看原帖
玄关:可(very)爱(long)代码求条
760776
zzy_zzy楼主2024/1/28 15:00

RT.

TLE on # 10 ,到底是做法假了还是要卡常

#include<bits/stdc++.h>
#define int long long
using namespace std;
struct node{
	int Next,to,w;
}e[500010],d[500010];
int head[250010],cnt,g[250010],head2[250010],cnt2,dep[250010],dfn[250010],l[250010][22],a[250010],b[250010],minn[250010][22],dp[250010],you[250010];
bool is[250010];
void add(int x,int y,int z){
	e[++cnt]=(node){head[x],y,z};
	head[x]=cnt;
}
void add2(int x,int y,int z){
	d[++cnt2]=(node){head2[x],y,z};
	head2[x]=cnt2;
}
int tot;
void dfs(int x,int fa){
	dfn[x]=++tot;
	dep[x]=dep[fa]+1;
	l[x][0]=fa;
	for(int i=1;i<=20;i++){
		l[x][i]=l[l[x][i-1]][i-1];
		minn[x][i]=min(minn[x][i-1],minn[l[x][i-1]][i-1]);
	}
	for(int i=head[x];i;i=e[i].Next){
		int y=e[i].to;
		if(y==fa)continue;
		minn[y][0]=e[i].w;
		dfs(y,x);
	}
}
int k,bl,o;
bool cmp(int x,int y){
	return dfn[x]<dfn[y];
}
int lca(int x,int y){
	if(dep[x]<dep[y]){
		swap(x,y);
	}
	for(int i=20;i>=0;i--){
		if(dep[l[x][i]]>=dep[y]){
			bl=min(bl,minn[x][i]);
			x=l[x][i];
		}
	}
	if(x==y){
		return x;
	}
	for(int i=20;i>=0;i--){
		if(l[x][i]!=l[y][i]){
			bl=min(bl,min(minn[x][i],minn[y][i]));
			x=l[x][i],y=l[y][i];
		}
	}
	return l[x][0];
}
void build(){
	sort(g+1,g+k+1,cmp);
	int num=0,p=0;
	for(int i=1;i<k;i++){
		a[++num]=g[i];
		a[++num]=lca(g[i],g[i+1]);
	}
	a[++num]=g[k];
	a[++num]=1;
	sort(a+1,a+num+1,cmp);
	for(int i=1;i<=num;i++){
		if(a[i]!=a[i+1]){
			b[++p]=a[i];
		}
	}
	for(int i=1;i<p;i++){
		int lc=lca(b[i],b[i+1]);
		bl=LONG_LONG_MAX;
		int feiwu=lca(lc,b[i+1]);
		add2(lc,b[i+1],bl);
		you[++o]=lc;
		you[++o]=b[i+1];
	}
}
void dfs2(int x,int fa){
	for(int i=head2[x];i;i=d[i].Next){
		int y=d[i].to;
		if(y==fa)continue;
		dfs2(y,x);
		if(is[y]){
			dp[x]+=d[i].w;
		}
		else{
			dp[x]+=min(dp[y],d[i].w);
		}
	}
}

signed main(){
    ios::sync_with_stdio(0);
    cin.tie(),cout.tie();
	int n;
	cin>>n;
	for(int i=1;i<n;i++){
		int x,y,z;
		cin>>x>>y>>z;
		add(x,y,z);
		add(y,x,z);
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=20;j++){
			minn[i][j]=LONG_LONG_MAX;
		}
	}
	dfs(1,0);
	int m;
	cin>>m;
	while(m--){
		cin>>k;
		for(int i=1;i<=k;i++){
			cin>>g[i];
			is[g[i]]=1;
		}
		build();
		dfs2(1,0);
		cout<<dp[1]<<endl;
		for(int i=1;i<=k;i++){
			is[g[i]]=0;
		}
		for(int i=1;i<=o;i++){
			dp[you[i]]=0,head2[you[i]]=0;
		}
		cnt2=0,o=0;
	}
	return 0;
}
2024/1/28 15:00
加载中...