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

【牛客练习赛55-E】:树【树形dp】 题目: 牛客练习赛55 - E:树 题意: 给定一颗边权全为 1 的树,求两两点之间距离的平方的和 分析: 如果是求两两之间距离的和,直接树形dp算每条边的贡献即可;现在题目要求距离平方的和,还是考虑树形dp枚举每条边计算每条边的贡献,套路地将平方展开看一下,比如算: (a+b+c)*(a+b+c) = a^2 + a*(b+c) + b^2 + b*(a+c) + c^2 + c*(... 阅读详情

题目

题目链接:https://ac.nowcoder.com/acm/contest/2927/E

你有一颗大小为 n \mathit n n 的树,点从 1 \mathit 1 1 到 n \mathit n n 标号。
设 dis ⁡ ( x , y ) \operatorname{dis}(x,y) dis(x,y)表示 x \mathit x x 到 y \mathit y y 的距离。
求 ∑ i = 1 n ∑ j = 1 n d i s 2 ( i , j ) \sum_{i=1}^n\sum_{j=1}^n dis^2(i,j) ∑i=1n​∑j=1n​dis2(i,j)对998244353取模的结果。


思路:

发现全部人写 O ( n ) O(n) O(n)的就我一个 O ( n log ⁡ n ) O(n\log n) O(nlogn)卡过去了还行。
考虑每一个点的贡献,我们求出每一个点为根时分别到其他点的距离平方之和。
那么换根时,只要将即将转移到的子节点内的子树距离全部减一,其他全部加一即可。
线段树维护区间和以及区间平方和。
转移时相当于 a 2 + b 2 + c 2 a^2+b^2+c^2 a2+b2+c2转移成了 ( a + 1 ) 2 + ( b + 1 ) 2 + ( c + 1 ) 2 (a+1)^2+(b+1)^2+(c+1)^2 (a+1)2+(b+1)2+(c+1)2,完全平方公式拆开即可。
时间复杂度 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=1000010,MOD=998244353;
int n,tot,head[N],dfn[N],rk[N],size[N],dep[N];
ll ans,sum;

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

struct Treenode
{
	int l,r;
	ll lazy,sum,ans;
};

struct Tree
{
	Treenode tree[N*4];
	
	void pushup(int x)
	{
		tree[x].ans=tree[x*2].ans+tree[x*2+1].ans;
		tree[x].sum=tree[x*2].sum+tree[x*2+1].sum;
	}
	
	void addans(int x,ll val)
	{
		tree[x].ans+=tree[x].sum*val*2LL+val*val*(ll)(tree[x].r-tree[x].l+1);
	}
	
	void pushdown(int x)
	{
		if (tree[x].lazy)
		{
			tree[x*2].lazy+=tree[x].lazy;
			tree[x*2+1].lazy+=tree[x].lazy;
			addans(x*2,tree[x].lazy); addans(x*2+1,tree[x].lazy);
			tree[x*2].sum+=tree[x].lazy*(ll)(tree[x*2].r-tree[x*2].l+1);
			tree[x*2+1].sum+=tree[x].lazy*(ll)(tree[x*2+1].r-tree[x*2+1].l+1);
			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].sum=dep[rk[l]];
			tree[x].ans=1LL*dep[rk[l]]*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].lazy+=val;
			addans(x,val);
			tree[x].sum+=val*(ll)(tree[x].r-tree[x].l+1);
			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)
{
	e[++tot].to=to;
	e[tot].next=head[from];
	head[from]=tot;
}

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

void dfs2(int x,int fa)
{
	ans=(ans+Tree.tree[1].ans)%MOD;
	sum=Tree.tree[1].ans;
	for (int i=head[x];~i;i=e[i].next)
	{
		int v=e[i].to;
		if (v!=fa)
		{
			Tree.update(1,dfn[v],dfn[v]+size[v]-1,-2);
			Tree.update(1,1,n,1);
			dfs2(v,x);
			Tree.update(1,1,n,-1);
			Tree.update(1,dfn[v],dfn[v]+size[v]-1,2);
		}
	}
}

int main()
{
	memset(head,-1,sizeof(head));
	scanf("%d",&n);
	for (int i=1,x,y;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		add(x,y); add(y,x);
	}
	dep[0]=-1; tot=0;
	dfs1(1,0);
	Tree.build(1,1,n);
	dfs2(1,0);
	printf("%lld",ans);
	return 0;
}
configure: error: no acceptable C compiler found in $PATH解决方案 本文主要介绍了configure: error: no acceptable C compiler found in $PATH解决方案,希望能对使用Linux的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案 阅读详情

相关推荐

【keras】走近VGG16卷积神经网络

        VGG16是一个16层的卷积神经网络模型,输入数据的维度为224*224*3,即长宽均为224像素的RGB彩色图片,VGG16模型的权重由ImageNet训练而来。由于其具有简单实用的优点,因此,在图像分类和目标检测任务中得到了较为广泛的应用。 1.卷积神经网络的基本概念 1.1卷积         简单的将其理解为一种数学运算,具体的计算过程如下图所示:       ...

XYZ 1万+

【二次扫描与换根】总结

在一棵无根树上需要以多个节点为根求解答案,可以运用。具体操作是通过实现一次自底向上的深度优先搜索和一次自顶向下的深度优先搜索来计算“换根”后的解。

cqbzliuhongyi的博客 1028

VCSA 6.7证书过期别慌!手把手教你通过SSH修改系统时间恢复登录(附STS证书修复脚本)

本文详细介绍了VCSA 6.7证书过期的应急处理方案,包括通过SSH修改系统时间临时恢复登录、全面更新证书体系以及专项修复STS证书的实战步骤。文章还提供了后期验证和系统加固的建议,帮助运维人员有效应对证书过期问题,确保虚拟化平台的稳定运行。

weixin_31292729的博客 415

【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

5分钟搞懂超分算法:从插值到深度学习的实战对比(附Python代码)

本文系统对比了从传统插值到深度学习的主流超分算法,包括最近邻、双线性、双三次插值,以及基于边缘、统计模型和SRCNN、ESPCN、SRGAN等深度学习模型。通过实战代码和决策框架,帮助开发者根据图像质量、速度、资源等需求,快速选择最合适的超分辨率算法,实现从低清到高清的有效转换。

pp12345的博客 427

VisionMaster脚本调试(VS)

使用VS调试VisionMaster 脚本

yu_fujiang的专栏 3292

E 树【牛客练习赛55 E】【换根DP 求树上所有两点间距离的平方】

题目链接 首先,我们来看一下平方的方程 然后,我们分析一下,我们现在可以很方便的求出一个点到其余各点的距离和的平方,那么假如要转移到另一个点的时候呢?怎么整呢?(换根思想!) 譬如说是一副这样的图,我们现在从now结点跳转至next结点,那么对于next结点他的信息应该如何计算呢?就是它到其余各点的距离的平方和。 首先,对now和next进行联合分析,now转移...

既然弱小,就只顾变强就是了 468

YOLOv8工业缺陷检测实战:攻克光照不均难题,精度从70%到92%的全流程优化(附缺陷数据集)

YOLOv8在工业缺陷检测中突破光照不均难题,核心是“硬件控光+数据造景+模型聚焦+训练攻坚硬件控光:从源头减少光照变异,降低算法难度;数据造景:用CLAHE、合成样本让模型“见过足够多的光照情况”;模型聚焦:用ECA注意力和Focal-EIoU损失,让模型盯住缺陷而非光照;训练攻坚:分阶段+难例挖掘,强迫模型学习薄弱点。这套方案已在汽车轴承、手机外壳、PCB板3类产线落地,平均精度提升20%+,漏检率控制在0.08%以内,完全满足工业级要求。

专注于Python爬虫开发,分享爬虫技巧、项目实战与反爬经验,使用Scrapy、BeautifulSoup等工具,解决数据抓取难题。 1193

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

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

danzh 344

HFSS仿真PCB射频通路间的隔离度

本文介绍HFSS方式仿真带有器件的射频通路间的隔离度,可视为CST方式的补充,二者的结果相互参照。在前期靠仿真确认风险点时,可以作为一种较为直观和可信的手段。

sinat_15150363的博客 1524

基于STM32单片机设计的红外测温仪(带人脸检测)_34

当前设计的这款红外非接触式测温仪由测温硬件+上位机软件组合而成,主要用在地铁、车站入口等地方,可以准确识别人脸进行测温,如果有人温度超标会进行语音提示并且保存当前人脸照片。

8769

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

题目: 题目链接:https://jzoj.net/senior/#main/show/3919 给出一棵树以及若干个标记点,树有边权,求分别从每一个点出发经过所有的标记点所需的最小边权和。 思路: 首先我们设TTT为能包含所有标记点的最小的树,sizeTsizeTsizeT为TTT的边权和。 考虑所有x∈Tx\in Tx∈T的点xxx,如果我们要求最终需要回到出发点(x)(x)(x),那么显然...

stoorz 309

23、资产分散化与有效前沿:投资组合优化的核心策略

本文深入探讨了现代投资组合理论的核心概念,包括分散投资的重要性、均值-方差优化框架以及有效前沿的构建与应用。通过案例分析和数学模型,阐述了如何通过科学方法降低投资组合风险并实现最优风险收益权衡。文章还介绍了实际应用中的求解方法与决策流程,为投资者提供系统的投资组合优化指导。

cc789的博客 114

刷题记录:牛客NC24019Max Flow

刷题记录:牛客NC24019Max Flow

yingjiayu12的博客 202

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

题解传送门

做个算法分类,这样找特定算法的题目就方便多了23333。

Resot的博客 1094

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

训练记录·每天三道

用于监督自己

landexiangmz的博客 311

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

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

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

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

weixin_30750335的博客 155

牛客练习赛55 E 树

树形dp,二次换根(算是吧

Ajwallet 610

牛客练习赛55 总结

爆炸

Ajwallet 713

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

牛客练习赛55 B 数字游戏

结论题,博弈

Ajwallet 579

牛客练习赛51

https://ac.nowcoder.com/acm/contest/1083#question A、 abc 题意: 给出一个字符串s,你需要做的是统计s中子串”abc”的个数。子串的定义就是存在任意下标a<b<c,那么”s[a]s[b]s[c]”就构成s的一个子串。如”abc”的子串有”a”、”b”、”c”、”ab”、”ac”、”bc”、”abc”。 输入描述: 一个...

AAAAAAAC的博客 524

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

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

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

ez_lcw的博客 636

牛客练习赛 55

E - 树 真就化简式子呗??? dist(x,y)=dep(x)+dep(y)−2dep(lca(x,y))dist(x,y)=dep(x)+dep(y)-2dep(lca(x,y))dist(x,y)=dep(x)+dep(y)−2dep(lca(x,y)) 于是可知 ∑x=1n∑y=1ndist2(x,y)=∑x=1n∑y=1ndep2(x)+dep2(y)+2dep(x)dep(y)+4dep2(lca(x,y))−4dep(lca(x,y))×(dep(x)+dep(y))\sum_{x=1}^{

Fighting_Peter的博客 238

POJ-3585 树形dp 换根法

题目 #include<iostream> #include<vector> #include<stdio.h> #include<string.h> #define P(i,j) make_pair(i,j) using namespace std; typedef long long ll; const int N=2e5+5; int t,n,...

刷题记录 313
上一篇: 【JZOJ3920】噪音【dp】
下一篇: 【JZOJ4815】ksum【堆】
stoorz1023
博客等级 码龄9年 101粉丝 595原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值