首页 > 其他分享 >树上前缀和

树上前缀和

时间:2022-11-07 12:23:11浏览次数:61  
标签:最简 前缀 int 点权 51 maxn 树上

树上前缀和
问题描述
有一棵n个点的树,每个点i有点树v[i],q个询问求点u到点v最简路径上所有点权之和
输入格式
第一行n,q表示有n个点,q个询问
第二行n个整数表示每个点的权
下面n-1每行两个整数x,y描述边的信息
下面q行每行两个整数u,v表示询问的两个点
输出
q行,每行为u到v最简路径上的点权和
样例
in
5 5
1 2 3 4 5

1 2
2 3
1 4
1 5
1 5
2 3
1 4
2 5
3 5
out
6
5
5
8
11

#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+10;
struct node{
	int to;
	int nxt;
}E[maxn<<1];
int v[maxn],h[maxn],f[maxn][25],dep[maxn],sum[maxn],lg[maxn],etot;
void addedge(int x,int y)
{
	E[++etot].to=y;
	E[etot].nxt=h[x];
	h[x]=etot;
}
void dfs(int u,int fa)
{
	f[u][0]=fa;
	dep[u]=dep[fa]+1;
	sum[u]+=sum[fa]+v[u];
	for (int i=1;i<=lg[dep[u]];i++)
	{
		f[u][i]=f[f[u][i-1]][i-1];
	}
	for (int i=h[u];i;i=E[i].nxt)
	{
		int v=E[i].to;
		if (v!=fa)
		{
			dfs(v,u);
		}	
	}	
}
int lca(int x,int y)
{
	if (dep[x]<dep[y]) swap(x,y);
	int d=dep[x]-dep[y];
	while(d)
	{
		int k=lg[d];
		x=f[x][k];
		d=d-(1<<k);
	}
	if (x==y) return x;
	for (int i=lg[dep[x]];i>=0;i--)
	{
		if (f[x][i]!=f[y][i])
		{
			x=f[x][i];
			y=f[y][i];
		}
	}
	return f[x][0];
}
int main()
{
	int n,q;
	cin>>n>>q; 
	for (int i=1;i<=n;i++) cin>>v[i];
	for (int i=2;i<=n;i++) lg[i]=lg[i<<1]+1;
	for (int i=1;i<n;i++)
	{
		int x,y;
		cin>>x>>y;
		addedge(x,y);
		addedge(y,x);
	}
	dfs(1,0);
	for (int i=1;i<=q;i++)
	{
		int u,v;
		cin>>u>>v;
		int k=lca(u,v);
		cout<<sum[u]+sum[v]-sum[k]-sum[f[k][0]]<<endl;
	}
}

  

标签:最简,前缀,int,点权,51,maxn,树上
From: https://www.cnblogs.com/smghj/p/16865511.html

相关文章

  • 二维数组的前缀和
    二维数组的前缀和设二维数组,intarr[5][7];,以arr[1][1]作为作为矩形的左上角坐标,以此开始存储数据,数组最左边,最上边不存储数据,为空设二维数组,int......
  • 基础算法篇——前缀和与差分
    基础算法篇——前缀和与差分本次我们介绍基础算法中的快速排序,我们会从下面几个角度来介绍前缀和:前缀和介绍前缀和基本题型前缀和介绍首先我们来简单介绍一下前缀和......
  • 浏览器私有前缀
    浏览器私有前缀1、私有前缀-moz-:代表Firefox浏览器私有属性-ms-:代表ie浏览器私有属性-webkit-:代表Safari、Chrome浏览器私有属性-o-:代表Opera浏览器私有属性2、提......
  • 代码源 - 树上路径1
    树上路径1给你一个\(n(1≤n≤2000)\)个点的树。给你\(m(1≤m≤2000)\)条树上的简单路径,每个路径有个权值\(a_i(1≤a_i≤109)\)。要求选择一些路径,使得每个点至多在......
  • P5369 [PKUSC2018]最大前缀和
    题意给定一个序列\(a\),求\(a\)的所有排列的最大前缀和的和。\(1\len\le20\)。Solution考虑到\(n\)很小的性质,想到状压。先考虑一手,最大前缀和应该满足什么条件......
  • Nt、Ki、Zw等前缀含义
    搜索到如下回答。 https://stackoverflow.com/questions/4770553/windows-native-api-when-and-why-use-zw-vs-nt-prefixed-api-callsWindows本机系统服务例程的名称......
  • 树上连通有关背包:【BZOJ4182】shopping &【HDU6566】The Hanged Man
    选这两道题是因为这两道题都是树上背包,而且选的点的要求都与连通性有关,而且都是按dfs序DP来模拟不断加入物品,而且都能用树剖和点分治优化(不过优化的点一个跟子树大小有......
  • 【XSY3490】线段树(广义线段树,树上莫队)
    题面线段树题解本题分两Part走。Part1我们需要解决:如何在广义线段树上快速区间定位节点。对于有\(n\)个叶子节点、共\(2n-1\)个节点的广义线段树\(A\),我们......
  • 【WC2019】数树(prufer序列,树上连通块DP,多项式exp)
    设两棵树的边集分别为\(E_1,E_2\),那么两棵树不同当且仅当它们对应的边集不同。转化一下可以发现,染色方案等于\(y^{n-|E_1\capE_2|}\),即由边集\(E_1\capE_2\)构成的......
  • 862. 和至少为 K 的最短子数组 : 前缀和 + 离散化 + 权值树状数组
    题目描述这是LeetCode上的​​863.二叉树中所有距离为K的结点​​,难度为困难。Tag:「前缀和」、「离散化」、「二分」、「树状数组」给你一个整数数组​​nums​......