论我纯暴力break优化过了这事。。。
查看原帖
论我纯暴力break优化过了这事。。。
1024904
LFRED2023楼主2024/8/20 20:32
#include<bits/stdc++.h>
using namespace std;
int v[600010];
int nxt[600010];
int head[300010];
int tot = 0;
int val[600010];
int n,m;
struct node{
	int s;
	int t;
	int dis;
	int lca;
}way[300010];
inline void add(int x,int y,int z)
{
	v[++tot] = y;
	val[tot] = z;
	nxt[tot] = head[x];
	head[x] = tot;
	return;
}
int dep[300010];
int fa[300010][21];
int fa_len[300010][21];
inline void dfs(int x,int f,int deep)
{
	fa[x][0] = f;
	dep[x] = deep;
	for(int i = head[x];i;i = nxt[i])
	{
		if(v[i] == f) continue;
		fa_len[v[i]][0] = val[i];
		dfs(v[i],x,deep + 1);
	}
	return;
}

inline int LCA(int x,int y,int &num)
{
	if(dep[x] < dep[y]) swap(x,y);
	if(x == y) return x;
	for(int log = 20;log >= 0;--log)
	{
		if(dep[fa[x][log]] > dep[y])
		{
			num += fa_len[x][log];
			x = fa[x][log];
		}
	}
	if(dep[x] > dep[y])
	{
		num += fa_len[x][0];
		x = fa[x][0];
	}
	if(x == y) return x;
	for(int log = 20;log >= 0;--log)
	{
		if(fa[x][log] != fa[y][log])
		{
			num += fa_len[x][log];
			num += fa_len[y][log];
			x = fa[x][log];
			y = fa[y][log];
		}
	}
	num += fa_len[x][0];
	num += fa_len[y][0];
	return fa[x][0];
}
inline bool cmp(node x,node y){return x.dis > y.dis;}
inline int check(int num,int s,int t,int lca)
{
	int road = 0;
	if(dep[num] > max(dep[s],dep[t])) return 0;
	if(dep[num] <= dep[lca]) return 0;
	if(LCA(s,num,road) == num || LCA(t,num,road) == num) return 1;
	return 0;
}
int main()
{
// 	freopen("tree.in","r",stdin);
// 	freopen("tree.out","w",stdout);
	ios::sync_with_stdio(0);
	cin >> n >> m;
	for(int i = 1,x,y,z;i < n;++i)
	{
		cin >> x >> y >> z;
		add(x,y,z);
		add(y,x,z);
	}
	dfs(1,1,1);
	for(int log = 1;log <= 20;++log)
	{
		for(int i = 1;i <= n;++i)
		{
			fa[i][log] = fa[fa[i][log - 1]][log - 1];
			fa_len[i][log] = fa_len[fa[i][log - 1]][log - 1] + fa_len[i][log - 1];
		}
	}
	for(int i = 1,x,y;i <= m;++i)
	{
		cin >> way[i].s >> way[i].t;
		way[i].lca = LCA(way[i].s,way[i].t,way[i].dis);
	}

	sort(way + 1,way + 1 + n,cmp);
//	for(int i = 1;i <= m;++i) cout << way[i].lca << " " << way[i].dis << endl;
	int minn = 1e9;
	int max_s = way[1].s;
	for(max_s = way[1].s;max_s != way[1].lca;max_s = fa[max_s][0])//删边 
	{
		int maxn = 0;
		for(int i = 1;i <= m;++i)//统计答案 
		{
			if(way[i].dis < maxn) break;
			if(check(max_s,way[i].s,way[i].t,way[i].lca))
			{
				maxn = max(maxn,way[i].dis - fa_len[max_s][0]); 
			}
			else
			{
				maxn = max(maxn,way[i].dis);
			}
			if(maxn > minn) break;
		}
		minn = min(minn,maxn);
	}
//	cout << minn << endl;
	for(max_s = way[1].t;max_s != way[1].lca;max_s = fa[max_s][0])//删边 
	{
		int maxn = 0;
		for(int i = 1;i <= m;++i)//统计答案 
		{
			if(way[i].dis < maxn) break;
			if(check(max_s,way[i].s,way[i].t,way[i].lca))
			{
				maxn = max(maxn,way[i].dis - fa_len[max_s][0]); 
			}
			else
			{
				maxn = max(maxn,way[i].dis);
			}
			if(maxn > minn) break;
//			cout << maxn << endl;
		}
		minn = min(minn,maxn);
	}
	if(minn == 1000000000) minn = 0; 
	cout << minn;
	return 0;
}

想交篇题解qwq

可以自己测一下试试qwq

2024/8/20 20:32
加载中...