bzoj 4765: 普通计算姬

Description

"奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些
。普通计算机能计算数列区间和,而普通计算姬能计算树中子树和。更具体地,小G的计算姬可以解决这么个问题
:给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权
值和。计算姬支持下列两种操作:
1 给定两个整数u,v,修改点u的权值为v。
2 给定两个整数l,r,计算sum[l]+sum[l+1]+....+sum[r-1]+sum[r]
尽管计算姬可以很快完成这个问题,可是小G并不知道它的答案是否正确,你能帮助他吗?
 

 

Input

第一行两个整数n,m,表示树的节点数与操作次数。
接下来一行n个整数,第i个整数di表示点i的初始权值。
接下来n行每行两个整数ai,bi,表示一条树上的边,若ai=0则说明bi是根。
接下来m行每行三个整数,第一个整数op表示操作类型。
若op=1则接下来两个整数u,v表示将点u的权值修改为v。
若op=2则接下来两个整数l,r表示询问。
N<=10^5,M<=10^5
0<=Di,V<2^31,1<=L<=R<=N,1<=U<=N
 

 

Output

对每个操作类型2输出一行一个整数表示答案。
 

 

Sample Input

6 4
0 0 3 4 0 1
0 1
1 2
2 3
2 4
3 5
5 6
2 1 2
1 1 1
2 3 6
2 3 5

Sample Output

16
10
9

HINT

 

 

思路

分块分块再分块,

假设块的长度是m,

可以先对编号分块,预处理出每个点对每一块的贡献(即这一块中有多少个x的祖先)。

这样时间复杂度n^2/m,空间复杂度n^2/m,为了不mle,m适宜<500。

这样修改操作就可以O(n/m)完成。

考虑询问操作,中间的完整块很好处理O(n/m),但左右端的残余块难处理。

可以扫残余块中的每个点,计算它们子树和的和,大约要计算m次子树和,即查询m次。

考虑怎样很快的计算子树和。

一种是log的做法,dfs序建树状数组,修改O(logn),查询O(logn)。但是这样查询多了一个log,不优。

考虑,每次操作,修改只进行了1次,查询进行了m次。所以考虑使修改变慢,查询变快。

所以,再对dfs序进行分块即可。这样修改O(n/m),查询1次O(1),非常优越。

时间复杂度n^2/m+nm=n*(n/m+m)。所以当m=sqrt(n)的时候,时间复杂度为O(n sqrt(n))

由于这种做法常数较大,虽然是O(n sqrt(n))的,有可能比那些带log的程序要慢(这也很尴尬啊)

 

代码

  1 #include <cmath>
  2 #include <cstdio>
  3 #include <iostream>
  4 using namespace std;
  5 int read()
  6 {
  7     char c=getchar();int d=0,f=1;
  8     for(;c<'0'||c>'9';c=getchar())if(c=='-')f=-1;
  9     for(;c>='0'&&c<='9';d=d*10+c-48,c=getchar());
 10     return d*f;
 11 }
 12 typedef unsigned long long ull;
 13 typedef long long ll;
 14 const int N=100002;
 15 int M,n,m,cnt,tot;
 16 int tmp[N],fa[N],bl[N],L[N],R[N],w[N*2],head[N],size[N],pos[N],t[320][N];
 17 ll s[N*2],bs[N*2],a[N*2];
 18 struct xint{int to,next;}e[N*2];
 19 inline void addedge(int x,int y)
 20 {
 21     e[++cnt]=(xint){y,head[x]};
 22     head[x]=cnt;
 23 }
 24 inline void add(int x,int s)
 25 {
 26     for(int i=R[x];i<=R[n];i+=M)a[i]+=s;
 27     for(int i=x;i<=R[x]-1;++i)a[i]+=s; 
 28 }
 29 inline ll ask(int x)
 30 {
 31     int A=pos[x]+size[x]-1,B=pos[x]-1;
 32     return ((A%M)?a[L[A]-1]+a[A]:a[A])-((B%M)?a[L[B]-1]+a[B]:a[B]);
 33 }
 34 inline void dfs(int x)
 35 {
 36     tmp[bl[x]]++;
 37     for(int i=1;i<=bl[n];++i)t[i][x]=tmp[i];
 38     pos[x]=++tot;
 39     size[x]=1; s[x]=w[x];
 40     for(int i=head[x];i;i=e[i].next)
 41     {
 42         int y=e[i].to;
 43         if(y==fa[x])continue;
 44         fa[y]=x;dfs(y);
 45         size[x]+=size[y];
 46         s[x]+=s[y];
 47     }
 48     tmp[bl[x]]--;
 49 }
 50 inline void init()
 51 {
 52     n=read()+1,m=read();
 53     M=int(sqrt(n));
 54     for(int i=1;i<=n;++i)bl[i]=(i-1)/M+1;
 55     for(int i=1;i<=n;++i)L[i]=bl[i]*M-M+1,R[i]=bl[i]*M;
 56     for(int i=2;i<=n;++i)w[i]=read();
 57     for(int i=2;i<=n;++i)
 58     {
 59         int x=read()+1,y=read()+1;
 60         addedge(x,y);
 61         addedge(y,x);
 62     }
 63     dfs(1);
 64     for(int i=1;i<=n;++i)bs[bl[i]]+=s[i];
 65     for(int i=1;i<=n;++i)add(pos[i],w[i]);
 66 }
 67 inline ull solve(int x,int y)
 68 {
 69     ull res=0;
 70     if(bl[x]==bl[y])
 71     {
 72         for(int i=x;i<=y;++i)res+=ask(i);
 73         return res;
 74     }
 75     for(int i=x;i<=R[x];++i)res+=ask(i);
 76     for(int i=L[y];i<=y;++i)res+=ask(i);
 77     for(int i=bl[x]+1;i<=bl[y]-1;++i)res+=bs[i];
 78     return res;
 79 }
 80 inline void work()
 81 {
 82     while(m--)
 83     {
 84         int o=read(),x=read(),y=read();
 85         if(o==1)
 86         {
 87             x++;
 88             ll dw=y-w[x];
 89             for(int i=1;i<=bl[n];++i)
 90                 bs[i]+=dw*t[i][x];
 91             add(pos[x],dw);
 92             w[x]=y;
 93         }else
 94         if(o==2)
 95         {
 96             x++,y++;
 97             ull ans=solve(x,y);
 98             printf("%llu\n",ans);
 99         }
100     }
101 }
102 int main()
103 {
104     init();
105     work();
106 }

 

转载于:https://www.cnblogs.com/Blog-of-Eden/p/6685423.html

今天出一个candence 17.4 allego的安装教程 7、安装完成,接下来进行补丁更新,找到Hotfix_SPB17.40.035_wint.iso软件 ,右击鼠标选择装载。6、因为之前选择的定制安装,这一步不知道具体要安装啥,因此都勾选,点击NECK,接下来等待安装完成。后面经过仔细对比,发现是前面更新补丁时选择了F盘,F盘是candence安装包,不是补丁。8、在破戒大师里选择安装更新补丁,并找到刚才装载的安装包里的程序,点击下一步。3、打开破戒大师,找到安装candence进行如下图选择,点击下一步。有耐心的人可以重新卸了再装一边,我就不卸了,直接装。 阅读详情

相关推荐

基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践

本文聚焦企业级报告生成场景中 “在线编辑模板 + 动态数据填充” 的核心需求,详细阐述基于 POI-TL、OnlyOffice 与 MinIO 的全栈实现方案。通过代码示例拆解模板加载、文字填充、图表匹配渲染(含通过关系 ID 关联图表与段落的关键逻辑)、报告存储全步骤。最终通过技术组合实现业务人员可视化编辑模板、后端高效填充数据的目标,为同类动态 Word 生成需求提供可复用的实践参考。

imHanweihu的博客 1867

普通计算姬

题意: 给出$n$个点的树,记$sum(x)$为$x$子树的点权和。$m$此操作 1.将一个点的权值改为c 2.查询$\sum_{x=l}^r { sum(x)}$ 解法: 修改一个点 x 的点权会使得从x到root的所有点的$sum(i)$加上一个数字。 考虑对1~n分块,块的大小为$O(\sqrt {\frac{n}{logn}})$。 对于每个块i,计算出$cnt(i,x...

weixin_30419799的博客 219

Kotlin kapt插件报错全解析:从Could not load module到彻底解决(含Gradle 8.2.2适配指南)

本文深度解析了Kotlin开发中常见的kapt插件报错“Could not load module”的根源,并提供了从诊断到解决的完整方案。重点探讨了Gradle 8.2.2与Kotlin 1.9.x的兼容性问题,包括JVM IR后端冲突、配置缓存问题及依赖版本对齐,并给出了详细的调试技巧与迁移至KSP的建议。

rrr55的博客 315

4765: 普通计算姬

4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1230  Solved: 264 [Submit][Status][Discuss] Description "奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计

CRZbulabula的博客 667

BitLocker恢复密钥丢失?从原理到实战的完整解锁与系统重生指南

磁盘加密技术是数据安全的核心防线,它通过对存储设备上的数据进行编码,确保未经授权的用户无法访问。其原理主要基于加密算法(如AES)与密钥管理机制,在操作系统启动前或数据读写时进行实时加解密。这项技术的核心价值在于防止设备丢失或被盗后的数据泄露,尤其对于笔记本电脑和移动设备至关重要。典型的应用场景包括企业办公电脑、存有敏感信息的个人设备以及符合合规性要求的行业。当使用Windows系统自带的BitLocker加密功能时,若因硬件改动、系统更新等触发保护机制,用户可能会面临需要输入恢复密钥才能启动的困境。本文聚

weixin_34006965的博客 492

Swift Package Manager (SPM) 创建并集成本地库

Swift Package Manager (SPM) 在macOS 项目中创建并集成的完整步骤

征战无悔人生 1425

【BZOJ4765】—普通计算姬(分块+BIT)

传送门 其实很简单 考虑修改一个点对于所有块的影响 我们可以预处理出一个数组ef[i][j]ef[i][j]ef[i][j]表示修改iii对第jjj块会影响几个点 显然只会影响iii的祖先 这个数组可以在dfsdfsdfs的时候继承父亲的O(n)O(\sqrt n)O(n​)得到 询问整块直接返回 散块相当于对于每一个点询问子树和 转成dfsdfsdfs序上区间求和就可以了 注意极限数据会爆lon...

Stargazer的博客 236

ROS2 Humble + TurtleBot4仿真环境搭建与避坑实战

本文详细介绍了ROS2 Humble与TurtleBot4仿真环境的搭建与避坑实战,包括环境配置、依赖安装、仿真调试和性能优化等关键步骤。通过保姆级教程和实用技巧,帮助开发者快速搭建稳定的机器人仿真环境,提升开发效率。特别推荐使用Ubuntu 22.04原生系统以避免常见问题。

weixin_30897233的博客 399

[BZOJ]2017省队十连测推广赛1

听学长说有比赛就随便打一打。 A.普通计算姬 题目大意:给出一棵带权树,支持一下两种操作:1.修改一个点的权值;2.给出l,r,询问以点l为根的子树和、点l+1为根的子树和、点l+2为根的子树和……点r为根的子树和的总和。(点数、操作数不超过10^5) 思路:感觉是三题中最难的。给出的[l,r]区间在树上没有实际意义,不好利用数据结构维护。考虑若不修改,可以一遍dfs算出每个点对应的d...

weixin_30770783的博客 145

给汽车芯片做‘体检’:手把手教你用IEC62380和SN29500估算功能安全失效率

本文详细介绍了如何使用IEC62380和SN29500标准估算汽车芯片的功能安全失效率,涵盖基础认知、方法论对比及实战计算。通过具体案例演示两种标准的应用流程,帮助工程师准确评估半导体器件的可靠性,确保符合ISO 26262标准要求。

weixin_28725553的博客 459

window下移动设备/硬盘报错位置不可用

移动硬盘指示灯亮,但电脑上不显示 报错信息 : 无法访问E:\。参数错误。 报错原因: 移动硬盘打不开提示参数错误,是因为这个H盘的文件系统内部结构损坏导致的。要怎么恢复里面的数据呢? https://jingyan.baidu.com/article/cb5d6105a80242005c2fe0c3.html 解决办法 : 不用格式化修复方法 方法一: 1、单击–开始–运行–输入cmd; 2、...

qq_40907977的博客 4928

[BZOJ4765]普通计算姬(分块+树状数组)

4765: 普通计算姬 Time Limit: 30 SecMemory Limit: 256 MBSubmit: 1725Solved: 376[Submit][Status][Discuss] Description "奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计算树...

weixin_30305735的博客 157

YOLOv13教程:手把手教你CSP_MutilScaleEdgeInformationSelect模块 通过DSM 在空间与局部对比域上做自适应选择

绿色线条为添加CSP_MutilScaleEdgeInformationSelect后的训练效果,map50指标提升12.45,准确率提升5.44。

FJN110的博客 816

BZOJ4765: 普通计算姬

BZOJ4765: 普通计算姬 题目描述 传送门 题目分析 求的和非常奇怪,不具有连续性,所有上树的数据结构全死了。 考虑分块,思考对于一段连续的询问区间可以直接询问整块,零散块可以在树上dfs序暴力求出。 使用预处理打标记的方式搞定每个点对每个块的影响是多少。这样修改的时候直接针对差值相应变动每个块的值就可以了。 那么dfs序上的值应该怎么快速查询,可以对dfs序进行另外的分块,同时使用前缀和...

weixin_30546189的博客 136

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

bzoj4765: 普通计算姬 分块 dfs序+线段树

bzoj4765: 普通计算姬 Description “奋战三星期,造台计算机”。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计算树中子树和。更具体地,小G的计算姬可以解决这么个问题 :给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和。计...

maxtir的博客 312

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

bzoj4765: 普通计算姬

树状数组+dfs序+分块

ACoder 573

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

bzoj 4765: 普通计算姬(分块 dfs序)

4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1502  Solved: 322 [Submit][Status][Discuss] Description "奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计

MR CODER 299

BZOJ 4765: 普通计算姬 分块+树状数组

4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1461  Solved: 317 [Submit][Status][Discuss] Description "奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计

~不可描述~ 401

bzoj 4765: 普通计算姬 分块

题意给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和。计算姬支持下列两种操作: 1 给定两个整数u,v,修改点u的权值为v。 2 给定两个整数l,r,计算sum[l]+sum[l+1]+….+sum[r-1]+sum[r] N<=10^5,M<=10^5分析既然不能用数据结构来维护,那就只能上暴力分块了。 一开始的想法是

beginend 857

bzoj 4765: 普通计算姬 分块+树状数组

Description “奋战三星期,造台计算机”。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些 。普通计算机能计算数列区间和,而普通计算姬能计算树中子树和。更具体地,小G的计算姬可以解决这么个问题 :给定一棵n个节点的带权树,节点编号为1到n,以root为根,设sum[p]表示以点p为根的这棵子树中所有节点的权 值和。计算姬支持下列两种操作: 1 给定两个整数u,v...

liangzihao1的博客 322

bzoj 4765: 普通计算姬(分块+树状数组)

4765: 普通计算姬 Time Limit: 30 Sec  Memory Limit: 256 MB Submit: 1481  Solved: 318 [Submit][Status][Discuss] Description "奋战三星期,造台计算机"。小G响应号召,花了三小时造了台普通计算姬。普通计算姬比普通计算机要厉害一些。普通计算机能计算数列区间和,而普通计算姬能计算树

加载中... 808

bzoj4765: 普通计算姬 (分块 && BIT)

最近一直在刷分块啊 似乎感觉分块和BIT是超级棒的搭档啊 这道题首先用dfs预处理一下 得到每一个sum值 此时查询是O(1)的 (前缀和乱搞什么的 但是修改需要O(n) (需要修改该节点所有祖先的sum 复杂度就爆了呀 此时考虑分块优化 似乎弹飞绵羊也是这样思考得出分块做法的 首先分成 √n 块 sum[i]记录第i块的sum和 中间的块直接用sum数组处理 两边用树状...

weixin_30747253的博客 97

BZOJ 4765: 普通计算姬 (分块+树状数组)

传送门 解题思路 树上的分块题,,对于修改操作,每次修改只会对他父亲到根这条链上的元素有影响;对于查询操作,每次查询[l,r]内所有元素的子树,所以就考虑dfn序,进标记一次,出标记一次,然后子树就是进与出之间的所有元素。分块后预处理出每个点修改对当前块多少个元素的影响f[i][j],再预处理出每个块的和,然后修改时利用f数组暴力扫一遍所有块,查询是大块直接查sum,小块用树状数组...

weixin_30646315的博客 123

BZOJ 4765: 普通计算姬 [分块 树状数组 DFS序]

传送门 题意: 一棵树,支持单点修改和询问以$[l,r]$为根的子树的权值和的和 只有我这种不会分块的沙茶不会做这道题吗? 说一点总结: 子树和当然上$dfs$序了,询问原序列一段区间所有子树和,对原序列分块,$sum_i$为一块的答案 查询很显然了,整块用$sum$,非整块暴力查子树 修改的话,预处理$f[i][j]$为点$j$对第$i$块的贡献,一遍$dfs$就可以预处理出来...

weixin_33720452的博客 104
上一篇: bzoj 4552: [Tjoi2016&Heoi2016]排序
下一篇: Codeforces 812E Sagheer and Apple Tree
aicui6749
博客等级 码龄11年 1粉丝 0原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值