【JZOJ3919】志愿者【线段树】【换根法】

1.3、云计算HCIP融合存储产品及部署 目标:描述Oceanstor V3系列存储产品系统组成及产品定位 描述Oceanstor V3硬件结构及软件架构 掌握存储系统与主机系统之间的连接 一、存储型号 低端型存储:Oceanstor 2200 2600 2800 V3/V5 终端型存储:Oceanstor 5300 5500 5600 5800 6800 V3/V5 高端型存储:Oceanstor 18000 二、Oceanstor V3系列存储系统定位 OceanStor V3系列存储系统是华为根据存储产品应用现状和存储 阅读详情

题目:

题目链接:https://jzoj.net/senior/#main/show/3919
给出一棵树以及若干个标记点,树有边权,求分别从每一个点出发经过所有的标记点所需的最小边权和。


思路:

首先我们设 T T T为能包含所有标记点的最小的树, s i z e T sizeT sizeT为 T T T的边权和。
考虑所有 x ∈ T x\in T x∈T的点 x x x,如果我们要求最终需要回到出发点 ( x ) (x) (x),那么显然答案就是 2 × s i z e T 2\times sizeT 2×sizeT。因为 T T T的每一条边都要正好经过两遍。
但如果一个点 x ∉ T x∉T x∈/​T,那么答案就是 2 ( s i z e T + d i s ) 2(sizeT+dis) 2(sizeT+dis)。其中 d i s dis dis表示 x x x与 T T T的距离。原因也是每一条边要经过两次。
但是我们到达最后一个标记点后可以不用回到出发点。所以为了使边权和最小,肯定最后去距离 x x x最远的点,这样 x x x与这个点的路径就只要走一次,而这个路径肯定能省就省。
那么可以用一棵线段树储存每一个标记点到现在 d f s dfs dfs到的点的距离。用
所以第一遍 d f s dfs dfs求出每一个特殊点的 i d , r k id,rk id,rk分别表示这是第几个遍历到的标记点,以及第 r k rk rk个遍历到的标记点是哪个。同时求出每一个点为根的子树内有多少个标记点,记为 s i z e size size
第二遍 d f s dfs dfs就算出每一个点到 T T T的距离 d i s dis dis,以及 s i z e T sizeT sizeT
第三遍 d f s dfs dfs就换根,同时维护线段树。
时间复杂度 O ( n log ⁡ n ) O(n\log n) O(nlogn)


代码:

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long ll;

const int N=500010;
int n,m,tot,root,head[N],id[N],rk[N],size[N];
ll sum,ans[N],dis[N],dep[N];
bool flag[N];

struct edge
{
	int next,to,dis;
}e[N*2];

struct Treenode
{
	int l,r;
	ll maxn,lazy;
};

struct Tree
{
	Treenode tree[N*4];
	
	void pushup(int x)
	{
		tree[x].maxn=max(tree[x*2].maxn,tree[x*2+1].maxn);
	}
	
	void pushdown(int x)
	{
		if (tree[x].lazy)
		{
			tree[x*2].lazy+=tree[x].lazy;
			tree[x*2+1].lazy+=tree[x].lazy;
			tree[x*2].maxn+=tree[x].lazy;
			tree[x*2+1].maxn+=tree[x].lazy;
			tree[x].lazy=0;
		}
	}
	
	void build(int x,int l,int r)
	{
		tree[x].l=l; tree[x].r=r;
		if (l==r)
		{
			tree[x].maxn=dep[rk[l]];
			return;
		}
		int mid=(l+r)>>1;
		build(x*2,l,mid); build(x*2+1,mid+1,r);
		pushup(x);
	}
	
	void update(int x,int l,int r,ll val)
	{
		if (l>r) return;
		if (tree[x].l==l && tree[x].r==r)
		{
			tree[x].maxn+=val;
			tree[x].lazy+=val;
			return;
		}
		pushdown(x);
		int mid=(tree[x].l+tree[x].r)>>1;
		if (r<=mid) update(x*2,l,r,val);
		else if (l>mid) update(x*2+1,l,r,val);
		else update(x*2,l,mid,val),update(x*2+1,mid+1,r,val);
		pushup(x);
	}
}Tree;

void add(int from,int to,int dis)
{
	e[++tot].to=to;
	e[tot].dis=dis;
	e[tot].next=head[from];
	head[from]=tot;
}

int dfs1(int x,int fa)
{
	if (flag[x]) id[x]=++tot,rk[tot]=x,size[x]=1;
		else id[x]=tot+1;
	for (int i=head[x];~i;i=e[i].next)
		if (e[i].to!=fa)
		{
			dep[e[i].to]=dep[x]+e[i].dis;
			size[x]+=dfs1(e[i].to,x);
		}
	return size[x];
}

void dfs2(int x,int fa)
{
	for (int i=head[x];~i;i=e[i].next)
	{
		int v=e[i].to;
		if (v!=fa)
		{
			if (!size[v]) dis[v]=dis[x]+e[i].dis;
				else sum+=e[i].dis;
			dfs2(v,x);
		}
	}
}

void dfs3(int x,int fa)
{
	ans[x]=sum*2+dis[x]*2-Tree.tree[1].maxn;
	for (int i=head[x];~i;i=e[i].next)
	{
		int v=e[i].to;
		if (v!=fa)
		{
			Tree.update(1,id[v],id[v]+size[v]-1,-e[i].dis*2);
			Tree.update(1,1,m,e[i].dis);
			dfs3(v,x);
			Tree.update(1,1,m,-e[i].dis);
			Tree.update(1,id[v],id[v]+size[v]-1,e[i].dis*2);
		}
	}
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d%d",&n,&m);
	for (int i=1,x,y,z;i<n;i++)
	{
		scanf("%d%d%d",&x,&y,&z);
		add(x,y,z); add(y,x,z);
	}
	for (int i=1,x;i<=m;i++)
	{
		scanf("%d",&x);
		flag[x]=1;
		root=x;
	}
	tot=0;
	dfs1(root,0);
	Tree.build(1,1,m);
	dfs2(root,0);
	dfs3(root,0);
	for (int i=1;i<=n;i++)
		printf("%lld\n",ans[i]);
	return 0;
}
Allegro基本规则设置指导书之Spacing Region 当网络需要在Region中需要按照自身的规则匹配时,可以创建Region Class来匹配。Region也支持Class to Class规则,点击ok即可。Allegro基本规则设置指导书之Spacing Region。下面介绍基本规则设置指导书之Spacing Region。给创建好的Region 匹配一个规则。空白的地方创建一个Region。 阅读详情

相关推荐

别再手动算重量了!用C++给UG/NX写个自动计算零件质量与质心的插件(附完整源码)

本文详细介绍了如何使用C++为UG/NX开发智能质量分析插件,实现零件质量与质心的自动计算。通过结合NXOpen和UF_MODL API,设计高效的数据结构和批量处理机制,大幅提升机械设计效率。文章包含完整源码和实用技巧,帮助工程师告别手动计算,适用于复杂装配体的自动化工程计算。

weixin_30247307的博客 130

【XSY3549】Tree(线段树,换根)

原题不想说(太懒了),就说一下总结到的两点想法? 对于树上多次询问路径信息的问题,如果两条路径的信息无法快速合并(即不能 pushup),但是在路径两端增加/删除单点后的信息变化可以快速得出,可以试一下能不能用询问离线+类似换根 DP 的方法维护:钦定当前根为路径一端,使用数据结构维护以每个点作为路径另一端的答案。先钦定 111 为根,暴力求出 111 为路径一端时所有路径的答案,然后 dfs 换根,换根时考虑对答案造成的影响,在数据结构上修改。 对于多次询问某个区间 [L,R][L,R][L,R] 的所

ez_lcw的博客 636

宝塔面板磁盘扩容后不生效?5步搞定Linux服务器磁盘空间更新(附详细命令)

本文详细解析了Linux服务器磁盘扩容后宝塔面板显示不生效的常见问题。通过理解磁盘、分区、文件系统三层逻辑,提供5步解决方案:检查磁盘状态、安装growpart工具、扩展分区、使用resize2fs命令扩展文件系统,并最终验证结果。文中附有详细命令和针对XFS、LVM等进阶场景的指南,帮助用户彻底解决磁盘空间更新问题。

weixin_29271263的博客 127

洛谷P3979 遥远的国度 树剖+线段树+换根

洛谷P3979 遥远的国度 标签 树链剖分 简明题意 给一棵有根树,支持3种操作: 修改:把树的根改为id 修改:把u-v路径上的权值改为v 查询:查询当前根下,x的子树中的最小权值 思路 这里比较麻烦的是换根操作。具体怎么处理呢? 注意事项 总结 AC代码 双倍经验 ...

danzh 344

SpringBoot+Maven打包实战:把项目变成SDK供其他团队调用

本文详细介绍了如何将SpringBoot项目改造并打包成可被其他项目依赖的SDK。通过调整Maven配置,剥离SpringBoot父依赖与启动类,并定制打包插件,最终生成标准的JAR依赖库,实现从“可执行应用”到“组件化SDK”的优雅转变,便于团队间功能复用。

assembly8low的博客 825

STM32CubeMX Nucleo F767ZI 教程(1)

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 例如:第一章 Python 机器学习入门之pandas的使用 提示:写完文章后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录系列文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 官网上买了个NUCLEO F767ZI 的开发板,144引脚的芯片,https://www.st.com/content/st_com/zh/products/evaluation-tools/prod

fafuwxm 2028

【dfs序】【线段树】树链剖分换根

【题目描述】 给定一棵大小为 n 的有根点权树,支持以下操作: • 换根 • 修改点权 • 查询子树最小值 【输入】 第一行两个整数 n, Q ,分别表示树的大小和操作数。 接下来n行,每行两个整数f,v,第i+1行的两个数表示点i的父亲和点i的权。保 证f &amp;lt; i。如 果f = 0,那么i为根。输入数据保证只有i = 1时,f = 0。 接下来 m 行,为以下格式中的一种: • V x y...

weixin_44111457的博客 712

【异常】OpenClaw提示Message ordering conflict - please try again. If this persists, use /new to start a fr

摘要:OpenClaw助手出现"Message ordering conflict"异常时,表明会话消息排序冲突,主要由消息队列时序错乱、会话同步异常或上下文过载引起。解决方案包括:1)基础重试暂停后单发指令;2)最优方案是发送/new重置会话;3)极端情况下需重启客户端或检查指令格式。预防建议包括避免高频并发指令、定期重置会话及确保网络稳定。该报错属业务层异常,不影响账号安全。

奶爸的编程之路,也就一周冷个三天 422

CF916E Jamie and Tree 倍增+换根+线段树

这道题有 3 个操作: 1. 换根 2. 求 LCA 3. 子树修改/子树求和. 对于第一个操作,直接换根就行. 对于第二个操作,分这几种情况讨论:$x,y$ 都在以 1 为根,$rt$ 的子树中,$x,y$ 其中 1 个在子树中,$x,y$ 都不在子树中. 对于都在子树中的情况,答案即为 $lca(x,y)$;对于第 2 种情况,答案为 RT;对于第 3 种情况,...

EM LGH 178

基于 YOLOv26 的电路焊点虚焊检测系统:AI 质检实战

本文介绍了一种基于YOLOv26的电路焊点虚焊检测系统,利用深度学习技术实现自动化质检。系统能识别虚焊、桥接、少锡等8种常见焊点缺陷,具有高精度、实时性和强鲁棒性等特点。文章详细阐述了系统架构,包括数据采集、预处理、YOLOv26检测模型和后处理模块,并提供了代码实现的关键部分,如数据预处理增强和模型训练配置。该系统可显著提高电子制造业的质检效率和准确性。

一键难忘的博客 690

Cesium 场景特效之【全球海洋】GL2兼容版

Cesium 场景特效之【全球海洋】GL2兼容版

喜欢钻研前端和分享技术 1272

【牛客练习赛55】E - 树【线段树】【换根法】【dfs】

题目 题目链接:https://ac.nowcoder.com/acm/contest/2927/E 你有一颗大小为 n\mathit nn 的树,点从 1\mathit 11 到 n\mathit nn 标号。 设dis⁡(x,y)\operatorname{dis}(x,y)dis(x,y)表示 x\mathit xx 到 y\mathit yy 的距离。 求∑i=1n∑j=1ndis2(i,...

stoorz 351

基于方差分解分析气象/水文干旱驱动因素(含MATLAB全代码)

简介基于方差分解方法分析气象/水文干旱驱动因素

WW、forever的博客 801

jzoj3919-志愿者【换根法,线段树,树形dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3919 题目大意 nnn个点kkk个需要到达的点,然后求每个点出发经过这些点的最短路径。 解题思路 因为不用回去,答案就是以这点为根链接所有点的树减去离这个点最远点的距离。 我们用线段树维护最远点距离,然后换根。 对于转移到一个节点,如果这个节点的子树没有任何必经点那么就加上这条边的边长,如果这个子树包含所...

QuantAsk 396

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

JZOJ 3919.【NOIP2014模拟11.3】志愿者

快乐树形dp

Ajwallet 357

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

CodeForces 1110F Nearest Leaf | 线段树/换根

我……又诈尸了…… 代码几乎都不会写了,打场CF居然上分啦,开心!(虽然还是比不过列表里的各路神仙) 题目链接 题目描述 一棵\(n\)个点的有根树,规定一种dfs序(规则:编号小的点优先dfs),\(m\)次询问一个点\(u\)和一个区间\([l, r]\),求dfs序在这个区间内的叶子中,到\(u\)最小的距离。 \(n, m \le 500000\) 题解 这题……很简单…… 题面一上来...

weixin_30750335的博客 155

Camera2Demo

在Camera2 的基础上进行封装,使得Camera2一堆初始化逻辑与Activity分离,降低耦合度,完成预览拍照并保存的操作

【jzoj3919】【COCI2014/2015 Round1 KAMP】【志愿者】【树形动态规划】

题目大意FJ王国有N个村庄组成,村庄之间构成树型结构,村庄之间的公路是双向的。由于发洪水,现在FJ召集了K名奶牛志愿者,每名志愿者被派遣到一个村庄支援救助,不同的志愿者被派遣到不同的村庄。FJ要选择一个村庄作为救灾大本营,一开始所有的志愿者都在该村庄,FJ自己作为司机,要用汽车把这K名志愿者送到各自目的地。FJ出发前会把所有奶牛志愿者都装到他的汽车上,然后按照FJ自己设计的路线,最终把所有奶牛送到目

inklutcuah’s blog 886

Codeforces 1110F. Nearest Leaf (线段树+换根+离线处理)

题目连接:https://codeforces.com/contest/1110/problem/F  F. Nearest Leaf time limit per test 4 seconds memory limit per test 512 megabytes input standard input output standard output Let's define...

Amo丶 323

[bzoj3083]遥远的国度

3083: 遥远的国度Time Limit: 10 Sec Memory Limit: 1280 MB Submit: 1733 Solved: 429 [Submit][Status][Discuss] Description描述 zcwwzdjn在追杀十分sb的zhx,而zhx逃入了一个遥远的国度。当zcwwzdjn准备进入遥远的国度继续追杀时,守护神RapiD阻拦了zcwwzdjn

Vampire 710

洪水

Description 一天, 一个画家在森林里写生,突然爆发了山洪,他需要尽快返回住所中,那里是安 全的。 森林的地图由R行C列组成,空白区域用点“.”表示,洪水的区域用“*”表示,而 岩石用“X”表示,另画家的住所用“D”表示,画家用“S”表示。 有以下几点需要说明: 1、 每一分钟画家能向四个方向移动一格(上、下、左、右) 2、 每一分钟洪水能蔓延到四个方向的相邻格子(空白区域) 3、 洪水...

Beautiful women in tights 334

【洛谷P1236】算24点【搜索】

比较简单的搜索题,注意细节即可

stoorz 1665

【洛谷P4205】智慧珠游戏【dfs】

题目大意: 题目链接:https://www.luogu.org/problem/P4205 智慧珠游戏拼盘由一个三角形盘件和 12 个形态各异的零件组成。拼盘的盘 件如图 1 所示 可以放到盘件的任一位置,条件是能有地方放,且 尺寸合适,所有的零件都允许旋转(0º、90º、180º、270º)和翻转(水平、竖直)。 现给出一个盘件的初始布局,求一种可行的智慧珠摆放方案,使所有的零件 都能放...

stoorz 1555

【JZOJ5776】小x游世界【换根法】【DP】【DFS】

题目大意: 题目链接:https://jzoj.net/senior/#main/show/5776 题目图片: http://wx4.sinaimg.cn/mw690/0060lm7Tly1fvjhzcpt7jj30j50f1aaw.jpg http://wx1.sinaimg.cn/mw690/0060lm7Tly1fvjhzchmayj30j30e5t8x.jpg http://wx4.si...

stoorz 1091

【JZOJ3888】正确答案【模拟】【dfs】

题目: 题目链接:https://jzoj.net/senior/#main/show/3888 小H与小Y刚刚参加完UOIP外卡组的初赛,就迫不及待的跑出考场对答案。 “吔,我的答案和你都不一样!”,小Y说道,”我们去找神犇们问答案吧”。 外卡组试卷中共有m道判断题,小H与小Y一共从其他n个神犇那问了答案。之后又从小G那里得知,这n个神犇中有p个考了满分,q个考了零分,其他神犇不为满分或零分。这...

stoorz 989

【CSP-S 2019】【洛谷P5666】树的重心【主席树】【树状数组】【dfs】

菜菜菜菜菜菜菜 终于改出来了qwq

stoorz 788

【洛谷P5651】基础最短路练习题【dfs】【并查集】

题目: 给定nnn个点mmm条边的无向简单联通图GGG,边有边权。保证没有重边和自环。 定义一条简单路径的权值为路径上所有边边权的异或和。 保证GGG中不存在简单环使得边权异或和不为0。 QQQ次询问xxx到yyy的最短简单路径。 思路: 题目保证了每一个简单环的异或和均为0。也就是说对于环上的任意两点(x,y)(x,y)(x,y),从x→yx\to yx→y的两条路径的权值相等。 所以对于每一...

stoorz 704
上一篇: 【JZOJ3918】蛋糕【二分】
下一篇: 【JZOJ3920】噪音【dp】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值