【树状数组】【dfs】树

题目大意:

有一棵树,当给一个点加上一个val时,他的儿子会减val,而他儿子的儿子会加上val(-(-val)=val),有m条指令,要不输出某个点的值,要不给某个点加值

原题:

题目描述

小L非常喜欢树。最近,他发现了一棵有趣的树。这棵树有n个节点(1到n编号),节点i有一个初始的权值ai。这棵树的根是节点1。
这棵树有一个特殊的性质:当你给节点i的权值加 val 的时候,节点i的所有儿子的权值都会加 -val。注意当你给节点i的儿子的权值加 -val 时,节点i的这个儿子的所有儿子的权值都会加 -(-val),以此类推。样例说明可以很好地帮助你理解这个性质。
有2种操作:
操作(a).“1 x val”表示给节点x的权值加val。
操作(b).“2 x”输出节点x当前的权值。
为了帮助小L更好地理解这棵树,你必须处理m个操作。

输入

第一行包含2个整数n和m。
第二行包含n个整数a1,a2,…,an(1≤ai≤1000)。
接下来的n-1行,每行两个整数u和v(1≤u接下来的m行,每行包含2种操作的一种。每个操作都保证1≤x≤n,1≤val≤1000。

输出

对于每个操作(b),输出一个整数,表示节点x当前的权值。

输入样例

5 5
1 2 1 1 2
1 2
1 3
2 4
2 5
1 2 3
1 1 2
2 1
2 2
2 4

输出样例

3
3
0

说明

【输入输出样例说明】

初始各个节点的权值依次为[1,2,1,1,2]。
第一个操作给节点2的权值增加3,会给节点2的儿子4、5的权值增加-3。此时各个节点的权值变成[1,5,1,-2,-1]。
第二个操作给节点1的权值增加2,会给节点1的儿子2、3的权值增加-2,然后会给节点2的儿子4、5的权值增加-(-2)。各个节点的权值变成[3,3,-1,0,1]。

【数据说明】

对于50%的数据,1≤n≤2000,1≤m≤2000。
对于100%的数据,1≤n≤100000,1≤m≤100000。

解题思路

80分思路1:

当给某个点加值时,dfs下去,要输出时,直接输出

#include<cstdio>
using namespace std;
int n,m,x,y,z,b[100005],head[100005];
struct rec
{int to,next;
}a[100005];
void dfs(int now,int d)
{b[now]+=d;//相加for (int i=head[now];i;i=a[i].next)//子节点dfs(a[i].to,-d);//数字翻转
}
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)scanf("%d",&b[i]);for (int i=1;i<n;++i){scanf("%d %d",&x,&y);a[i].to=y;//存储a[i].next=head[x];head[x]=i;}for (int i=1;i<=m;++i){scanf("%d %d",&y,&x);if (y==2){printf("%d\n",b[x]);//输出continue;}scanf("%d",&z);//输入dfs(x,z);//dfs下去}
}

80分思路2:

给某个点价值时,先存下来,等输出时,再往父节点搜

#include<cstdio>
using namespace std;
int n,m,x,y,z,b[100005],dad[100005],zj[100005];
int dfs(int dep,int now)
{if (!dep) return 0;//搜完了return zj[dep]*now+dfs(dad[dep],-now);//继续往上
}
int main()
{scanf("%d %d",&n,&m);for (int i=1;i<=n;++i)scanf("%d",&b[i]);for (int i=1;i<n;++i){scanf("%d %d",&x,&y);dad[y]=x;//记录父节点}for (int i=1;i<=m;++i){scanf("%d %d",&x,&y);if (x&1)//加值{scanf("%d",&z);zj[y]+=z;//记录起来continue;}printf("%d\n",b[y]+dfs(y,1));//往父节点搜}
}

正解

按奇偶性分下类
然后树状数组修改即可(懒)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321048.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

SP1811-Longest Common Substring【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/SP1811 题目大意 求两个串的最长公共子串。 解题思路 对与第一个串首先构建一个SAMSAMSAM&#xff0c;然后考虑让第二个串在上面匹配。 对于枚举的每个位置要在SAMSAMSAM上找一个节点使得它的后缀是枚举到的位置的后缀。所…

使用Nexus搭建私有Nuget仓库

前言Nuget是ASP .NET Gallery的一员&#xff0c;是免费、开源的包管理工具&#xff0c;专注于在.Net / .Net Core应用开发过程中第三方组件库的管理&#xff0c;相对于传统单纯的dll引用要方便、科学得多。其中nuget.org是最著名的Nuget公开库&#xff0c;但是企业内部开发的&a…

Wannafly挑战赛26 题解

Wannafly挑战赛26 题目连接 https://www.nowcoder.com/acm/contest/212#question A. 御坂网络 枚举圆心所在的位置,O(n)O(n)O(n) 检查即可,总时间复杂度为O(n2)O(n^2)O(n2) B. 冥土追魂 这题比较坑,我感觉题意叙述有问题,总之也是一道水题,题解略去. C. 七彩线段 题解 …

初一模拟赛总结(3.16)

成绩&#xff1a; rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111lyflyflyf210210210303030100100100000808080222hkyhkyhky190190190100100100000101010808080333fyfyfy120120120100100100000202020000444tjhtjhtjh100100100100100100000000000555wjjwj…

牛客挑战赛43C-最优公式【二分】

正题 题目链接:https://ac.nowcoder.com/acm/contest/7413/C 题目大意 给一个序列AAA&#xff0c;求两个a,ba,ba,b使得∑i1n∑j1nmax{∣Ai−a∣,∣Aj−b∣}\sum_{i1}^n\sum_{j1}^nmax\{|A_i-a|,|A_j-b|\}i1∑n​j1∑n​max{∣Ai​−a∣,∣Aj​−b∣}最小。 解题思路 因为是取…

好代码是管出来的——Git的分支工作流与Pull Request

上一篇文章好代码是管出来的——使用Git来管理源代码 介绍了常用的版本控制工具以及git的基本用法&#xff0c;从基本用法来看git与其它的版本控制工具好像区别不大&#xff0c;都是对代码新增、提交进行管理&#xff0c;可以查看提交历史、代码差异等功能。但实际上git有一个重…

牛客练习赛29 题解

牛客练习赛29 A. 可持久化动态图上树状数组维护01背包 题解 这题跟标题没有任何关系… 贪心的使得负数删除的时候下标尽可能大,然后正数的时候下标尽可能小. 观察到每个数下标最大的时候就是它的初始下标,下标的最小值是1. 然后贪心一下就好了. 代码 #include <iost…

【Floyed】小萨的烦恼(ssl 1624)

小萨的烦恼 ssl 1624 题目大意&#xff1a; 一个无向图&#xff0c;可以使其中一条道路的值除以2&#xff0c;求两个点之间的最短路 原题&#xff1a; Description 圣诞节又要到了&#xff01;小萨希望和自己心仪的MM一起出去度过一个浪漫的的圣诞节。他进行了详尽的准备…

好代码是管出来的——使用GitHub

前面的文章介绍了Git的基本概念和用法&#xff0c;本文则是基于GitHub的一个实践介绍&#xff0c;主要内容有&#xff1a;GitHub简介个人与组织仓库的创建与维护Fork与pull request小结GitHub简介GitHub是一个Git的远程代码托管平台&#xff0c;它除了提供代码托管外&#xff0…

Wannafly挑战赛24

Wannafly挑战赛24 题目连接 https://www.nowcoder.com/acm/contest/186#question A.石子游戏 题解 注意到当石子个数为偶数的时候,每回合都会减少一堆偶数石子,因此,先手必胜. 我们可以不考虑奇数堆石子,因为必胜方始终可以动偶数堆. 当必败方将奇数堆分成一堆偶数和一堆…

【模拟】正方形

正方形 题目大意&#xff1a; 有三个人&#xff0c;一人一笔的画正方形&#xff0c;每个正方形是上一个正方形每条边上的中点连接而成的&#xff0c;求每个人画了多长 原题&#xff1a; 题目描述 又到暑假啦&#xff0c;Conan, Ayumi, Mitsuhiko, Genta一起到Hakase家愉快…

P3975-[TJOI2015]弦论【SAM】

正题 题目链接:https://www.luogu.com.cn/problem/P3975 题目大意 给一个字符串sss和t,kt,kt,k。求字符串sss第kkk大的子串。 当T0T0T0时&#xff0c;相同的子串算一个当T1T1T1时&#xff0c;不同位置的相同子串算不同的串 解题思路 当T0T0T0时很简单&#xff0c;对于每个位…

【DP】跳格子

跳格子 题目大意&#xff1a; 有一堆格子&#xff0c;可以往前跳不超过当前格子上的数的步数&#xff0c;从1跳到最后一格最少要跳多少 原题&#xff1a; 题目描述 大家都说要劳逸结合&#xff0c;Ayumi, Mitsuhiko, Genta画完方格就出去运动啦&#xff01; 他们来到了一片…

.NET Core微服务之基于IdentityServer建立授权与验证服务

一、IdentityServer的预备知识要学习IdentityServer&#xff0c;事先得了解一下基于Token的验证体系&#xff0c;这是一个庞大的主题&#xff0c;涉及到Token&#xff0c;OAuth&OpenID&#xff0c;JWT&#xff0c;协议规范等等等等&#xff0c;园子里已经有很多介绍的文章了…

模拟退火求解TSP问题

模拟退火求解TSP问题 模拟退火算法步骤 1.寻找下一个解 2.计算下一个解的能量 3.决定是否接受这个解 4.降温 算法模板 double randfloat() {return rand()/(RAND_MAX0.0); }double T0 1000000,Tk 1,T T0,d 0.9999; int x initx();//当前解(初始解) int ansE,nowE;//全…

P2444-[POI2000]病毒【AC自动机】

正题 题目链接:https://www.luogu.com.cn/problem/P2444 题目大意 nnn个字符串&#xff0c;求有没有一个无限的字符串不包含任何一个给出的字符串。 解题思路 考虑ACACAC自动机的匹配方式&#xff0c;不过每次我们可以每次在构出的TrieTrieTrie树上随意走&#xff08;就是求完…

【模拟】2048

2048 题目大意&#xff1a; 模拟2048游戏 原题&#xff1a; 题目描述 此时&#xff0c;Conan却在一旁玩着2048。 这是一个4*4的矩阵&#xff0c;初始全为0。每次一个没有数字的格子中会随机出现一个2或4&#xff0c;每次可以选择上下左右其中一个方向去滑动&#xff0c;每…

在Docker中部署Asp.net core2.1以及修改发布

本篇文章主要是如何在Docker容器中运行ASP.NET Core应用程序&#xff0c;以及修改系统之后&#xff0c;发布更新。本文章采用自定义的Docker文件系统要求&#xff1a;1.服务器或本地已经安装docker一、创建一个Asp.Net Core 2.1 Web应用&#xff08;若可以熟练创建项目&#xf…

HDU5322 - cdq分治FFT加速dp

5322 Hope [CDQ分治FFT加速计算dp] 题意 每一个每一个排列,排列中每个数向它后面第一个比它大的数连一条边. 每个排列对于答案的贡献是这个排列所生成的图中的每一个联通量中点的个数的平方之积. 例如:排列 1,2,3,6,4,51,2,3,6,4,51,2,3,6,4,5 其中 1,2,3,61,2,3,61,2,3,6形…

AT2300-[ARC068C]Snuke Line【整除分块】

正题 题目链接: https://www.luogu.com.cn/problem/AT2300 https://atcoder.jp/contests/arc068/tasks/arc068_c 题目大意 有mmm个车站&#xff0c;nnn种礼品&#xff0c;第iii种可以在[li,ri][l_i,r_i][li​,ri​]的车站买到&#xff0c;第ddd辆车会近过编号为ddd的倍数的车…