萌新求助,消耗战 TLE 60pts
查看原帖
萌新求助,消耗战 TLE 60pts
152213
Querainykkksd15楼主2021/4/3 19:14

T了5,6,7,9四个点,评测记录,求调/kel

看了看好像大家都是因为把前向星memset了才T的,可是我也没memset,之前写了一份差不多的也过了,就很迷惑/kk

#include<stdio.h>
#include<algorithm>
using std::sort;

const int inf=0x7fffffff;

inline long long min(long long x,long long y){ return x<y?x:y; }

struct Graph
{
	struct Edge
	{
		int v,w,next;
	}e[2000002];
	
	int ecnt,h[1000002];
	inline void add_edge(int u,int v,int w=0)
	{
		e[++ecnt]={v,w,h[u]};
		h[u]=ecnt;
		e[++ecnt]={u,w,h[v]};
		h[v]=ecnt;
	}
}G,T;

int fa[1000002],dep[1000002],size[1000002];
int dfn[1000002],id[1000002],cnt;
long long dis[1000002];

namespace LCA//树剖lca
{

int son[1000002],top[1000002];

void dfs1(int u,int _fa,int _w)
{
	fa[u]=_fa;
	dep[u]=dep[fa[u]]+1;
	dis[u]=min(dis[fa[u]],_w);
	size[u]=1;
	dfn[++cnt]=u,id[u]=cnt;
	for(int i=G.h[u];i;i=G.e[i].next)
		if(G.e[i].v!=fa[u])
			dfs1(G.e[i].v,u,G.e[i].w),size[u]+=size[G.e[i].v],
			son[u]=(size[G.e[i].v]>size[son[u]]?G.e[i].v:son[u]);
}

void dfs2(int u,int _top)
{
	top[u]=_top;
	if(son[u]) dfs2(son[u],_top);
	for(int i=G.h[u];i;i=G.e[i].next)
		if(G.e[i].v!=fa[u])
			dfs2(G.e[i].v,G.e[i].v);
}

inline void swap(int &x,int &y){ x^=y^=x^=y; }
inline int lca(int u,int v)
{
	while(top[u]!=top[v])
	{
		if(dep[top[u]]<dep[top[v]]) swap(u,v);
		u=fa[top[u]];
	}
	return dep[u]<dep[v]?u:v;
}

}
using LCA::lca;

int s[1000002],top;
#define clear(u) T.h[u]=0
inline void insert(int u)//插入虚树
{
	int l=lca(u,s[top]);
	if(l!=s[top])
	{
		while(id[l]<id[s[top-1]]) T.add_edge(s[top-1],s[top]),top--;
		if(id[l]!=id[s[top-1]]) clear(l),T.add_edge(l,s[top]),s[top]=l;
		else T.add_edge(l,s[top]),top--;
	}
	clear(u),s[++top]=u;
}

inline bool cmp(int u,int v){ return id[u]<id[v]; }
inline void build(int n,int *a)
{
	sort(a+1,a+n+1,cmp);
	T.ecnt=0,clear(1),s[top=1]=1;
	for(int i=1;i<=n;i++)
		if(a[i]!=1) insert(a[i]);
	for(int i=1;i<top;i++) T.add_edge(s[i],s[i+1]);
}

long long dp[1000002];
bool b[1000002];

void dfs(int u,int fa)
{
	dp[u]=0;
	for(int i=T.h[u];i;i=T.e[i].next)
		if(T.e[i].v!=fa)
		{
			dfs(T.e[i].v,u);
			if(b[T.e[i].v]) dp[u]+=dis[T.e[i].v];
			else dp[u]+=min(dis[T.e[i].v],dp[T.e[i].v]);
		}
}

int n,m,k,a[1000002];

int main()
{
	scanf("%d",&n);
	for(int i=1,u,v,w;i<n;i++)
		scanf("%d%d%d",&u,&v,&w),G.add_edge(u,v,w);
	dis[0]=inf;
	LCA::dfs1(1,0,inf);
	LCA::dfs2(1,1);
	scanf("%d",&m);
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&k);
		for(int j=1;j<=k;j++)
			scanf("%d",&a[j]),b[a[j]]=1;
		build(k,a);
		dfs(1,0);
		printf("%lld\n",dp[1]);
		for(int j=1;j<=k;j++) b[a[j]]=0;
	}
	return 0;
}
2021/4/3 19:14
加载中...