蒟蒻数据
查看原帖
蒟蒻数据
528787
OIer_Automation楼主2023/12/30 09:21

神秘的 O(∑k2log⁡k)O(\sum k^2\log k) 算法切掉了 8080 分

#include <bits/stdc++.h>
using namespace std;

const int N=1e6;
int n,m;
struct Graph{
	int cnt,a,b;
	int head[N+5],to[(N<<1)+5],v[(N<<1)+5];
	void clear(){
		cnt=1;
		return ;
	}
	void add(int x,int y){
		v[cnt]=y;
		to[cnt]=head[x];
		head[x]=cnt++;
		return ;
	}
	void add_edge(){
		scanf("%d%d",&a,&b);
		add(a,b),add(b,a);
	}
}RG;
struct Lca{
	int dep[N+5],siz[N+5],faz[N+5],son[N+5],top[N+5];
	void dfs1(int u){
		siz[u]=1;
		son[u]=0;
		for(int i=RG.head[u];i;i=RG.to[i]){
			int v=RG.v[i];
			if(v==faz[u])continue;
			faz[v]=u;
			dep[v]=dep[u]+1;
			dfs1(v);
			siz[u]+=siz[v];
			if(siz[v]>siz[son[u]])son[u]=v;
		}
		return ;
	} 
	void dfs2(int u,int rt){
		top[u]=rt;
		if(son[u])dfs2(son[u],rt);
		for(int i=RG.head[u];i;i=RG.to[i]){
			int v=RG.v[i];
			if(v==faz[u]||v==son[u])continue;
			dfs2(v,v);
		}
		return ;
	}
	void pre(){
		dfs1(1);
		dfs2(1,1);
		return ;
	}
	int lca(int x,int y){
		while(top[x]!=top[y]){
			if(dep[top[x]]<dep[top[y]])swap(x,y);
			x=faz[top[x]];
		}
		if(dep[x]<dep[y])swap(x,y);
		return y;
	}
	int dis(int x,int y){
		return dep[x]+dep[y]-2*dep[lca(x,y)];
	}
}Lca;
struct Solve{
	int k;
	int lst[N+5];
	long long sum,Min,Max;
	long long min(long long a,long long b){
		return a<b?a:b;
	}
	long long max(long long a,long long b){
		return a>b?a:b;
	}
	void query(){
		sum=Max=0;
		Min=2e9;
		scanf("%d",&k);
		for(int i=1;i<=k;i++)scanf("%d",&lst[i]);
		for(int i=1;i<=k;i++){
			for(int j=i+1;j<=k;j++){
				int D=Lca.dis(lst[i],lst[j]);
				sum+=D;
				Min=min(Min,D);
				Max=max(Max,D);
			}
		}
		printf("%lld %lld %lld\n",sum,Min,Max);
	}
}Q;

int main(){
	RG.clear();
	scanf("%d",&n);
	for(int i=1;i<n;i++)RG.add_edge();
	Lca.pre();
	scanf("%d",&m);
	for(int i=1;i<=m;i++)Q.query();
}
2023/12/30 09:21
加载中...