LOJ146 dfs序3 题解(dfs序+树状数组+树上差分)

Codeforces 1467E DFS序 + 树上差分        题目大意为,定义合法的根:根到任意结点的路径上的点权唯一,求合法的根的数量。        我们很容易想到,合法的根的数量 = 总点数 - 非法根的数量。        对于任意点权相同的结点,只有它们之间的路径上的结点以及结点的子树才有可能合法,除此之外一定不合法。  &nb 阅读详情

题目:LOJ146.
题目大意:给定一棵 n n n个点的树,要求支持以下操作:
1.格式 1   a   b   c 1\,a\,b\,c 1abc,表示把链 ( a , b ) (a,b) (a,b)上的点点权加上 c c c.
2.格式 2   a 2\,a 2a,表示查询点 a a a的点权.
3.格式 3   a 3\,a 3a,表示查询点 a a a的子树点权和.
设操作次数为 m m m,则 1 ≤ n , m ≤ 1 0 6 1\leq n,m\leq 10^6 1≤n,m≤106.

本来的想法是给大力跑出这棵树的dfs序,然后用 1 1 1和 − 1 -1 −1标号,并用线段树维护的,但是线段树常数太大貌似并过不了这道题…

于是我们考虑换用树状数组,仍然利用dfs序,只不过现在我们变成了用dfs序维护每个点到根这些链被直接会被增加多少,也可以看做是自底向上的差分,我们记点 k k k的这个值为 v [ k ] v[k] v[k].

然后我们维护链加就变成了直接给一个点加,当然由于不是一个点到根的链需要用到树上差分;查询点权变成了查询子树和;查询子树和…等等子树和怎么搞?

容易发现查询 x x x的子树和,可以统计子树中每个节点 k k k的贡献,容易发现节点 k k k的贡献为 v [ k ] ∗ ( d e p [ k ] − d e p [ x ] + 1 ) v[k]*(dep[k]-dep[x]+1) v[k]∗(dep[k]−dep[x]+1),其中 d e p [ k ] dep[k] dep[k]表示 k k k的深度.那么我们发现这个式子可以拆成 v [ k ] ∗ d e p [ k ] − v [ k ] ∗ ( d e p [ x ] − 1 ) v[k]*dep[k]-v[k]*(dep[x]-1) v[k]∗dep[k]−v[k]∗(dep[x]−1),后半个我们已经维护了 v [ k ] v[k] v[k]之和再乘 d e p [ x ] − 1 dep[x]-1 dep[x]−1即可,前半个我们可以通过多用一个树状数组维护 v [ k ] ∗ d e p [ k ] v[k]*dep[k] v[k]∗dep[k]来实现.

时间复杂度 O ( ( n + m ) log ⁡ n ) O((n+m)\log n) O((n+m)logn).注意这道题卡常严重,建议输入用快读且找LCA用树剖或者tarjan.

代码如下:

#include<bits/stdc++.h> 
  using namespace std;
  
#define Abigail inline void
typedef long long LL;

const int N=1000000;

int Ri(){
  int x=0,y=1;
  char c=getchar();
  for (;c<'0'||c>'9';c=getchar()) if (c=='-') y=-1;
  for (;c<='9'&&c>='0';c=getchar()) x=x*10+c-'0';
  return x*y;
}

struct side{
  int y,next;
}e[N*2+9];
int lin[N+9],top,n,m,rot;

void Ins(int x,int y){
  e[++top].y=y;
  e[top].next=lin[x];
  lin[x]=top;
}

int ld[N+9],rd[N+9],ord[N+9],co;
struct node{
  int fa,son,top,siz,dep;
}d[N+9];
LL c[2][N+9],v[N+9];

void Dfs1(int k,int fa){
  ord[++co]=k;ld[k]=co;
  d[k].fa=fa;
  d[k].dep=d[fa].dep+1;
  d[k].siz=1;
  for (int i=lin[k];i;i=e[i].next)
    if (e[i].y^fa) {
	  Dfs1(e[i].y,k);
      d[k].siz+=d[e[i].y].siz;
      if (d[d[k].son].siz<d[e[i].y].siz) d[k].son=e[i].y;
	}
  rd[k]=co;
}

void Dfs2(int k,int top){
  d[k].top=top;
  if (d[k].son) Dfs2(d[k].son,top);
  for (int i=lin[k];i;i=e[i].next)
    if (e[i].y^d[k].fa&&e[i].y^d[k].son) Dfs2(e[i].y,e[i].y);
}

int Lca(int x,int y){
  while (d[x].top^d[y].top)
    d[d[x].top].dep>d[d[y].top].dep?x=d[d[x].top].fa:y=d[d[y].top].fa;
  return d[x].dep<d[y].dep?x:y;
}

void Bit_add(int t,int x,LL v){if (x==0) return;for (;x<=n;x+=x&-x) c[t][x]+=v;}
LL Bit_query(int t,int x){LL sum=0;for (;x;x-=x&-x) sum+=c[t][x];return sum;}
LL Bit_query(int t,int l,int r){return Bit_query(t,r)-Bit_query(t,l-1);}

void Add_chain(int x,int y,LL v){
  int lca=Lca(x,y);
  Bit_add(0,ld[x],v);Bit_add(0,ld[y],v);
  Bit_add(0,ld[lca],-v);Bit_add(0,ld[d[lca].fa],-v);
  Bit_add(1,ld[x],v*d[x].dep);Bit_add(1,ld[y],v*d[y].dep);
  Bit_add(1,ld[lca],-v*d[lca].dep);Bit_add(1,ld[d[lca].fa],-v*d[d[lca].fa].dep);
}

void Build(){for (int i=1;i<=n;++i) Add_chain(i,i,v[i]);}
LL Query_node(int x){return Bit_query(0,ld[x],rd[x]);}
LL Query_tree(int x){return Bit_query(1,ld[x],rd[x])-Bit_query(0,ld[x],rd[x])*(d[x].dep-1);}

Abigail into(){
  n=Ri();m=Ri();rot=Ri();
  int x,y;
  for (int i=1;i<=n;++i) v[i]=(LL)Ri();
  for (int i=1;i<n;++i){
  	x=Ri();y=Ri();
  	Ins(x,y);Ins(y,x);
  }
}

Abigail work(){
  Dfs1(rot,0);
  Dfs2(rot,rot);
  Build();
}

Abigail getans(){
  int opt,x,y,c;
  while (m--){
  	opt=Ri();
  	switch (opt){
	  case 1:
	  	x=Ri();y=Ri();c=Ri();
	  	Add_chain(x,y,(LL)c);
	  	break;
	  case 2:
	  	x=Ri();
	  	printf("%lld\n",Query_node(x));
	  	break;
	  case 3:
	  	x=Ri();
	  	printf("%lld\n",Query_tree(x));
	  	break;
	}
  }
}

int main(){
  into();
  work();
  getans();
  return 0;
}
2.1 SRv6 TE Policy SRv6 TE Policy是在SRv6技术基础上发展的一种新的隧道引流技术。SRv6 TE Policy路径表示为指定路径的段列表(Segment List),称为SID列表(Segment ID List)。每个SID列表是从源到目的地的端到端路径,并指示网络中的设备遵循指定的路径,而不是遵循IGP计算的最短路径。如果数据包被导入SRv6 TE Policy中,SID列表由头端添加到数据包上,网络的其余设备执行SID列表中嵌入的指令。 阅读详情

相关推荐

点云直线检测-3DLineDetection复现

点云直线分割-Fast 3D line detection

阁楼 8156

LOJ146 DFS 序3,树上差分1【DFS】

DFS 序3,树上差分1 Time Limit: 2000 MS Memory Limit: 131072 K Problem Description 这是一道模板题。 给一棵有根树,这棵树由编号为1…N的N个结点组成。根结点的编号为 R。每个结点都有一个权值,结点i的权值为vi。 接下来有M组操作,操作分为两类: 1 a b x,表示将「结点a到结点b的简单路径」上所有结点的权值都增加x...

Dust_heart的博客 2382

Altair HyperWorks软件二次开发:二次开发成果展示与报告撰写

HyperMesh Python API允许用户通过Python脚本控制HyperMesh的大部分功能,包括模型创建、修改和分析。它提供了丰富的函数库,可以处理节点、元素、材料属性、载荷和边界条件等。二次开发可以用于创建自定义工具,这些工具可以集成到HyperWorks中,提供特定的功能或简化复杂的操作。

kkchenjj的博客 1639

LOJ146, LOJ147 DFS序

LOJ146: 给定一棵 nnn 个结点的树,根结点为 rrr,初始点权 wiw_iwi​,mmm 次操作: ① 1,a,b,x1, a, b, x1,a,b,x,aaa 到 bbb 最短路径间点权都加上 xxx; ② 2,a2, a2,a,求结点 aaa 的点权; ③ 3,a3, a3,a,求结点 aaa 子树点权和。 (n,m≤106)(n, m \leq 10^6)(n,m≤106) 链接:...

weixin_44059127的博客 614

Linux下驱动开发_块设备驱动开发(硬件上采用SD卡+SPI协议)

这一篇文章将采用SD卡作为存储硬件,利用SPI协议与SD卡通信,完成块设备驱动开发测试。 SD卡可以更加形象的表示块设备开发过程,明白硬件如何交互,完成数据读写。

2603

C#上位机实战:手把手搭智慧工业数字孪生系统,从设备建模到实时联动全落地

字段长度(字节)说明起始标识2固定为0xAA55,用于判断数据包开始设备ID4唯一标识设备(比如1001代表电机1)数据类型10=布尔(启停),1=浮点数(转速/温度)数据长度4数据字节数(布尔1字节,浮点数4字节)数据内容N实际数据(按数据长度读取)校验位1前面所有字节的异或校验,防止数据篡改结束标识2固定为0x55AA,用于判断数据包结束。

这里只有干货:从 Modbus 通信到 MES 对接,从 YOLO 训练到工控机部署,带你搞定工业软件开发全流程。 967

loj 146

题意 给一棵节点数为n的有根树和根的编号,树上的节点有点权。有m次操作,操作分为3种:询问一个点的点权,询问以一个点为根的子树的点权,将一条链上的点的点权加上一个权值。 数据范围 1≤n,m≤1e6,−1e6≤点权≤1e61\le n,m \le 1e6,-1e6\le 点权 \le 1e61≤n,m≤1e6,−1e6≤点权≤1e6 解法: dfs序+树上差分+树状数组 (题外话:树剖做这个应该非...

xiayuyang 530

【MATLAB】嵌入式ADC/DAC控制工程

摘要:本文针对嵌入式ADC/DAC应用中存在的量化误差、采样噪声、输出漂移等问题,提出基于MATLAB的仿真优化方案。通过构建完整的ADC/DAC仿真模型,实现了采样建模、数字滤波、误差校准和闭环控制仿真。方案采用滑动平均滤波抑制ADC噪声,双校准参数补偿DAC固有误差,并将算法轻量化移植至STM32平台。实测表明,该方案使ADC采样波动从±25mV降至±5mV,DAC输出偏差从42mV降至18mV,显著提升了模拟量交互精度和系统稳定性。整套方案资源占用低,适配各类嵌入式高精度控制场景,具有较高的工程应用价

unber的博客 648

【C++】dfs序与树上差分

dfs序与树上差分 引入 dfs序就是用递归的方法遍历一棵树的顺序。 这是一个括号序列,有助于解决树上的很多问题。树上差分算法,是一个适用于树上区间操作的算法.它是差分数组,前缀和求解的树上拓展. 众所周知,树这类特殊的结构,往往具有很多性质,而树上差分往往就是结合这些性质,进行高效率的处理.我们还需要知道一点,树上差分基本上不会出裸题,往往会和大量的算法结伴出行.树上差分,准确来说不是算法,而是一种优秀的思想.

Ljnoit 1262

运维系列【仅供参考】:微信版本过低 使用CheatEngine绕过

微信版本过低 使用CheatEngine绕过

weixin_54626591的博客 2133

智能手表PCB布局:PPG与IMU传感器噪声隔离与应力解耦设计

在可穿戴设备硬件开发中,PCB布局已超越传统布线范畴,成为决定信号完整性、电磁兼容性与机械可靠性的核心环节。心率传感器(PPG)依赖微伏级光电容积脉搏波信号,极易受数字开关噪声与电源纹波干扰;姿态传感器(IMU)则对PCB弯曲形变引发的机械应力高度敏感。其布局需融合电磁场建模、热-力-电多物理协同及高密度互连约束。关键技术价值体现在噪声路径切断、地弹抑制、应力方向解耦与电源域隔离等工程实践。典型应用场景涵盖智能手表、医疗级贴片设备及微型运动传感终端。本文聚焦PPG与IMU两大模组在STM32L4平台上的实操

weixin_32869687的博客 172

树上差分

看一个简单的问题: 对于一棵树,一开始权值都为0,有K个操作,每次操作对应一组(x,y),将x到y路径上的节点权值+1,最后问节点最大权值。 对于每个节点,记一个差分数组f【】,每次操作将f【x】、f【y】加1,将f【LCA】和f【LCA的父亲】减1,最后每个数的权值等于子树内f数组的和。取个max即可。是不是很简单~~~例题 代码

Moon1125666900的博客 583

ZYNQ 使用AXI_BRAM实现PS与PL 数据交互数据交互

有时CPU需要与PL进行小批量的数据交换,可以通过Block RAM实现。通过Zynq 的GP Master 接口读写PL端的 BRAM,实现PS与PL的交互。加入自定义的 FPGA 程序,并利用 AXI4 总线进行配置,通知何时读写 BRAM。CPU通过 AXI BRAM Controller 读取 BRAM 数据,CPU 仅配置自定义的 PL BRAM Controller 的寄存器,不通过它读写数将BRAM与socket进行联合使用,将电脑的数据发到PS端,PS端放在PL端,PL端再发给PS端,P据。

wangjie36的博客 1万+

DFS序列

DFS序是指对一棵树进行DFS时,每个节点被访问到的顺序。DFS序分成两个部分:进入该节点的顺序和退出该节点的顺序。

weixin_62944148的博客 1195

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

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

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

LOJ dfs序1234

DFS 序 1 题目要求: ① uuu节点权值+x+x+x ② 询问uuu子树权值和 uuu节点权值+x+x+x :直接加 uuu子树权值和:dfs序+树状数组 LOJ提交代码 DFS 序 1 DFS 序 2 题目要求: ① uuu节点子树权值+x+x+x ② 询问uuu子树权值和 uuu节点子树权值+x+x+x:dfs序+区间修改 询问uuu子树权值和:dfs序+区间求和 区修+区改可以用2个树状数组或者lazy线段树 LOJ提交代码 DFS 序 2 DFS 序 3,树上差分 1 题目要

Fighting_Peter的博客 537

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

模拟赛 T3 DFS序+树状数组+树链的并+点权/边权技巧

题意:给定一颗树,有 $m$ 次操作. 操作 0 :向集合 $S$ 中加入一条路径 $(p,q)$,权值为 $v$ 操作 1 :给定一个点集 $T$,求 $T$ 的并集与 $S$ 中路径含交集的权和.(就是如果路径 $i$ 与 $T$ 有交集,就产生 $v_{i}$ 的贡献) 数据范围:路径长度 $\leqslant 20$,$1\leqslant n,m \leqslant 10^5$...

EM LGH 168

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

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

2018.11.06【LOJ147】DFS序4(DFS序)(树状数组)

传送门 解析: 其实用DFSDFSDFS序可以将很多树剖能做的东西的复杂度优化一个log⁡\loglog,不过需要一点小小的转化,因为DFSDFSDFS序只能处理子树问题。 显然这道题直接用树剖做是O(nlog⁡2n)O(n\log^2n)O(nlog2n)的,但是用纯粹的DFSDFSDFS序+树状数组可以做到O(nlog⁡n)O(n\l...

anlongyi8087的博客 484

loj 1046(bfs)

题目链接:http://acm.hust.edu.cn/vjudge/problem/viewProblem.action?id=26766 思路:由于数据不是很大,我们可以枚举骑士最后聚集的位置,然后枚举的时候用bfs搜索即可。 1 #include&lt;iostream&gt; 2 #include&lt;cstdio&gt; 3 #include&lt;cstring...

weixin_33736649的博客 186

LOJ147 dfs序4 题解(dfs序+树状数组+树上差分)

题目:LOJ147. 题目大意:给定一棵nnn个点的树,要求支持以下操作: 1.格式1&ThinSpace;a&ThinSpace;x1\,a\,x1ax,表示将点aaa的点权增加xxx. 2.格式2&ThinSpace;a&ThinSpace;x2\,a\,x2ax,表示将点aaa的子树增加xxx. 3.格式3&ThinSpace;a&ThinSp...

hzk_cpp的博客 1345

LOJ #145. DFS 序 2

线段树,dfs序

良月澪二的博客 556

LOJ 147 DFS序+ST表求LCA+树上差分

题目链接 理解链接 ①先用dfs序或欧拉序把树转成区间,因为dfs序是前序遍历,根节点总在前面,而子树结点数,可以dfs时回溯求得,因此dfs序可以轻松维护子树的信息。 ②然后用树状数组维护每个点到根的距离(通过前缀和求),这题用树状数组因为只涉及区间加减的修改,复杂度常数比线段树小。(但树状数组局限性大,不支持乘除等复杂的修改) ③最后如何求两点距离?树上差分(通俗理解,前缀和or子树和...

zjyang12345的博客 770

LOJ DFS序

DFS序 题解 转载于:https://www.cnblogs.com/DyLoder/p/9978826.html

dianzanji4884的博客 230

LOJ145 DFS序2(dfs序模板)

题目:LOJ145. 这只是个用来屯板子的blog,原文. 代码如下: #include<bits/stdc++.h> using namespace std; #define Abigail inline void typedef long long LL; const int N=1000000; int Ri(){ int x=0,y=1; char c=...

hzk_cpp的博客 688

LOJ6045 「雅礼集训 2017 Day8」价

标签:最小割,网络流题目题目传送门分析30分——爆搜 40分——加一个特判(全部取)(因为Pi小于0)正解: 最小割建图: 源点S向每个减肥药连一条流量为Pi+inf的边 减肥药向其对应的药材连一条流量为inf的边 每个药材向汇点T连一条流量为inf的边 然后跑dinic 因为存在负边权,那么要加入sum计算进入减肥药的总流量,然后输出maxflow(ans)-sum即可 因为二分图

Welcome to yjjr's blog! 1486

loj10146. 「一本通 4.6 练习 3」普通平衡树(loj104. 普通平衡树 )

思路:   十分经典的treap板子题 #include<cstdio> #include<iostream> #include<cstdlib> using namespace std; const int maxn = 100010; inline void qread(int &x){ x = 0; ...

weixin_30498807的博客 205

【Tarjan】UOJ#146 【NOIP2015】信息传递

题面在这里Tarjan刷最小环……示例程序:

linkfqy 706
上一篇: 蓝书(算法竞赛进阶指南)刷题记录——POJ3700 Missile Defence System(dfs+贪心)
下一篇: LOJ147 dfs序4 题解(dfs序+树状数组+树上差分)
hezlik
博客等级 码龄9年 111粉丝 241原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值