ACM-ICPC 2018 沈阳赛区网络赛 J. Ka Chang(分块+树状数组+dfs序)

2018ICPC沈阳网络赛题解 这是2018ICPC沈阳网络赛的题解,这是2018ICPC沈阳网络赛的题解 立即下载

Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero point.

Then, you need to handle QQ operations. There're two types:

1\ L\ X1 L X: Increase points by XX of all nodes whose depth equals LL ( the depth of the root is zero ). (x \leq 10^8)(x≤108)

2\ X2 X: Output sum of all points in the subtree whose root is XX.

Input

Just one case.

The first lines contain two integer, N,QN,Q. (N \leq 10^5, Q \leq 10^5)(N≤105,Q≤105).

The next n-1n−1 lines: Each line has two integer aa,bb, means that node aa is the father of node bb. It's guaranteed that the input data forms a rooted tree and node 11 is the root of it.

The next QQ lines are queries.

Output

For each query 22, you should output a number means answer.

样例输入复制

3 3
1 2
2 3
1 1 1
2 1
2 3

样例输出复制

1
0

题目来源

ACM-ICPC 2018 沈阳赛区网络预赛

 

题意:

有一颗有根树,根的深度为0,一共有两种操作。

操作1:将深度为L的这一层的节点都加上一个数X。

操作2:求X节点的所有子树上的节点值的和。

 

思路:

参考的博客:传送门

因为每次操作1是把一层都更新了,如果考虑操作1用一个数组记录下来所有层增加量,那么操作2的时间复杂度会很大。如果考虑操作2用dfs序+树状数组,那么操作1的更新的时间复杂度也很大。所以采用了分块的思想,将节点数大于等于sqrt(n)的那层直接用一个数组记录下来,这部分的操作2用二分出X的子树的每层大于sqrt(n)的节点数乘以它的变化值。而对于节点数小于sqrt(n)的一层则用暴力的修改在树状数组中的值,操作2用dfs序+树状数组来解决。这样折中了两者的复杂度。

 

代码:

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+5;
vector<int> e[maxn];
vector<int> d[maxn];
vector<int> que;
int n,m;
int in[maxn],out[maxn];
int ma;
ll a[maxn];
ll tr[maxn];
inline int lowbit(int i)
{
    return i&(-i);
}
void add(int x,ll c)
{
    while(x<=n){
        tr[x]+=c;
        x+=lowbit(x);
    }
}
ll query(int x)
{
    ll ans=0;
    while(x){
        ans+=tr[x];
        x-=lowbit(x);
    }
    return ans;
}
int tot;
void dfs(int u,int fa,int deep)
{
    in[u]=++tot;
    d[deep].push_back(tot);
    ma=max(deep,ma);
    for(int i=0;i<e[u].size();i++){
        int son=e[u][i];
        if(son==fa) continue;
        dfs(son,u,deep+1);
    }
    out[u]=tot;
}
int main()
{
    int u,v,op,l,pos;
    ll x;
    scanf("%d%d",&n,&m);
    for(int i=1;i<=n-1;i++){
        scanf("%d%d",&u,&v);
        e[u].push_back(v);
        e[v].push_back(u);
    }
    int siz=sqrt(n);
    dfs(1,-1,0);
    for(int i=0;i<=ma;i++){
        if(d[i].size()>=siz){
            que.push_back(i);
        }
    }
    for(int i=1;i<=m;i++){
        scanf("%d",&op);
        if(op&1){
            scanf("%d%lld",&l,&x);
            if(d[l].size()>=siz){
                a[l]+=x;
            }
            else {
                for(int i=0;i<d[l].size();i++){
                    add(d[l][i],x);
                }
            }
        }
        else {
            scanf("%d",&pos);
            ll ans=query(out[pos])-query(in[pos]-1);//小的值
            for(int i=0;i<que.size();i++){
                int deep=que[i];
                ans+=a[deep]*((upper_bound(d[deep].begin(),d[deep].end(),out[pos]))-(lower_bound(d[deep].begin(),d[deep].end(),in[pos])));
            }
            printf("%lld\n",ans);
        }
    }
    return 0;

}

 

Hypermesh静力学仿真分析与模态分析-02 hypermesh中对较复杂实体进行静力学分析和模态分析,包含材料属性添加,载荷设置等等 阅读详情

相关推荐

Halcon工业相机开发全流程:从SDK配置到实时图像采集(C++版)

本文详细介绍了使用C++进行Halcon工业相机开发的完整流程,从SDK配置到实时图像采集的实现。涵盖环境搭建、设备初始化、回调机制、参数控制等关键环节,并提供异常处理和实战案例,帮助开发者快速掌握工业视觉系统的开发技巧。

weixin_33728268的博客 512

2018横滨区域赛G What Goes Up Must Come Down【树状数组】

题意:给你一个序列,你只可以交换相邻的两项,使其满足以下条件:递增,递减,先增后减,求最小交换次数。 思路:找出每个位置前面的数与其构成的逆序对数与后面的数构成的逆序对数的较小值,然后把每个位置上的值相加即可。 #include<cstdio> #include <iostream> #include <algorithm> #include<bit...

独钓门前月 939

学习海康VisionMaster之BLOB分析

6):软阈值(相对):是一种动态阈值分割方法,其核心思想是 基于图像局部特性(如背景或参考区域)自适应调整阈值范围,适用于光照变化明显、背景灰度不均的场景。3:拖入位置修正功能:这个非常重要,模版匹配成功后会得到新的匹配坐标,那和创建模版时候的原点坐标会组合成一个坐标变换矩阵,通过这个矩阵,那后续的blob分析窗口则可以实现精确定位来查找目标对象。(2):设定参数:这里阈值方式是blob的核心算法,根据不同的应用场景来选择不同的阈值方式。8:高级参数:是设定blob区域的特征范围,用于筛选出来特定的区域。

yuhouxiyang的专栏 3620

第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明)I.Simone and graph coloring【最长下降子序列 / 树状数组】

Link 树状数组 / 最长下降子序列 题意 给定n个数字,对所有的逆序对建边,构成一个无向图,现对所有的点进行染色,求一种染色方案,使得相邻结点颜色不同,且使用颜色数最少 分析 若模拟情况,会发现逆序对数最多是n2n^2n2数量级,所以建边的话会炸时空,显然考虑找性质规律 任找两组数据进行模拟 4 3 2 1 —> 1 2 3 4 5 4 3 1 2 —> 1 2 3 4 4 发现第i号数的答案为以i为结尾的最长下降子序列 考虑两种方法 用数据结构,即树状数组:对于第i号数,找到

while_you的博客 218

关于STM32编译报错:Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o).

今天新建工程发现出现一个错误 —— …\Output\CG.axf: Error: L6218E: Undefined symbol SystemInit (referred from startup_stm32f10x_md.o). 但我觉得我的操作没有任何问题,而且配置和上一个文件比较是一模一样的。 于是我开始百度查询,然后发现了下面几个博客—— @weixin_44133391——STM32 编译错误 @dorlolok——iel5 编译报错 error: L6235E: More than one

纯粹,学术,热爱。 9403

个人信息保护合规审计人员(中级)能力测试试卷

本文是关于个人信息保护合规审计的考试指南,包含选择题、判断题、简答题和案例分析题。选择题考察《个人信息保护法》的关键条款,如敏感信息处理、跨境传输、委托处理等合规要求。判断题测试对个人信息处理规则的理解,如撤回同意、公开信息处理等。简答题要求阐述审计流程、个人权利、委托处理义务等内容。案例分析题以互联网企业为例,分析违规行为并提出整改建议,涉及数据收集、第三方共享、自动化决策等问题。全文旨在帮助中级审计人员掌握个人信息保护的法律规定和审计实务,提升合规审计能力。

qq_41525079的博客 547

2016 ACM/ICPC大连区域赛 E—Aninteresting game【树状数组】

题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1005&amp;cid=736 Aninteresting game Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others) Total Submissi...

lml11111的博客 337

matlab电偶极子源码,电偶极子的MATLAB场模拟

电偶极子周围电场电势分布的MATLAB三维模拟Matlab可以用于模拟四维场的效果,本文以电偶极子的电场和电势场为例展示MATLAB在该方面领域的应用。摘要电偶极子由一个正电荷和一个负电荷组成,其电场和空间电势分布与单电荷相比具有一些重要的特性。本文将给出电场和电势场的近似表达式。这两个量的精确表达式是复杂的,不太常用,因此 MATLAB 被采用来操作精确值和绘制三维分布的远区域, 近区域和一侧区...

weixin_35135480的博客 3150

hdu 5975 树状数组原理题(16亚洲区域赛大连站)

lowbit[i]表示的其实就是i的二进制表示中,不为0的最低位; 对于询问1的区间[L,R],很好处理; ans=cal(R)-cal(L-1); cal(x)表示集合1到集合x,这x个集合一共加进去的数的个数; 加入集合k的数,根据题目给的公式可以推导出就是2^lowbit(k),即2的整数次幂; 所以直接枚举2的整数次幂即可在log(x)的时间复杂度里快速得出cal(x)答案 对于询问2

The_star_is_at的博客 640

英飞凌TC3xx之一起认识GTM系列(六)如何实现GTM与VADC关联的配置

本文给出了GTM与EVADC之间关联的细节,并通过两个实例分别说明了如何对寄存器进行配置。

无所适从的我的博客 2932

OpenCV入门(一)Python环境的搭建

因为有点Python基础,并且Python是比较好入门的编程语言,所以,机器视觉后面打算在Python这个平台下进行。

小幽余生不加糖 8123

【题解】hdu4970(2018-07-24校赛 树状数组 B)树状数组

题目链接 树状数组区间修改区间查询 #include&amp;lt;cstdio&amp;gt; #include&amp;lt;cstring&amp;gt; typedef long long ll; const int N=1e5+10; ll sum1[N*2],sum2[N*2],n; ll lowbit(ll x) { return x&amp;amp;(-x); } void add(ll x,ll v) { ...

翻过这座山,他们就会听到你的故事 190

PHM 2010数据集解读

PHM数据挑战赛是一项面向所有潜在与会者的竞赛。今年的挑战集中在使用测力仪、加速度计和声发射数据估计高速数控铣床刀具的RUL上。 博客对PHM 2010数据集的组成和信号进行了可视化。

cnjs1994的博客 7648

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang 题意:两个操作,1操作将深度为x的所有点加权值k,2操作询问x的子树的权值和。 q<=1e5,n<=1e5。 思路:可以考虑两种思路,第一种用树状数组维护每个dfs序对应点的权值,当操作1输入x,k时则把深度为x的所有点的所对应dfs序再在树状数组中都加k,然后查询子树x的权值和时即ask(out[x])-ask(...

EDGiboy的博客 319

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

[ACM-ICPC 2018 沈阳赛区网络预赛] J.Ka Chang (分块+dfs序)

题目链接 题意: 给定一棵nnn个点的树,有两种操作: 1.1.1.给所有深度为LLL的点权值加上XXX。 2.2.2.查询根为XXX的子树的点权和。 给出qqq次操作,对于每次操作222,输出结果。 (1≤n,q≤105)(1\leq n,q \leq 10^{5})(1≤n,q≤105) 思路: 如果只有操作111,我们可以维护bfsbfsbfs序,这样同深度的点一定在一段连续的区间中。 如果只有操作222,我们可以维护dfsdfsdfs序,这样某个点的子树一定在一段连续的区间中。 但是二者不可兼得,我

Zimba_的博客 190

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang dfs序+大小分治

Problem J. Ka Chang Input file: standard input Output file: standard output Time limit: 1 seconds Memory limit: 128 mebibytes Problem Description Given a rooted tree ( the root is node 1 ) of nn...

J. Cole 351

WINCC7.3破解文件

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

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块+dfs序+树状数组)

题目链接 题意: 给你一颗n个节点的树,每一个节点的值为0。 q种操作,1.将深度为L的点的权值加x,根节点的深度为0 2.输出以x为根节点的子树的权值和 解析: 这道题最后想到了分块,因为我想到用的一种方法需要用[1e5][1e5]的空间去维护,有空间问题, 然后借此想到分块可以处理,小的部分暴力,大的部分用数组保存状态,这样就存的下了 不过我想的是按层来分块,前block层,和...

咸鱼有梦想 284

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块+树状数组+dfs序)

题意 给你一颗树,由两种操作: 1.把这棵树深度为DDD的点全部都加上一个值。 2.求以p为根节点的子树的权值和是多少? *思路 对于树上的东西,我们可以把他求一下DFS序,之后就可以把树上的结构变成线性的结构,之后就是查询和修改这两个东西了。 关于修改:对于修改来说,当前层的点少的时候我们直接树状数组暴力修改,对于当前层数的点太多的情况来说,我们把层数打上标记。 对于查询,我们先查...

wjmwsgj的博客 238

ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang——分块

设置块的大小为sz,当更新的层的节点数小于sz时直接暴力更新,大于sz时给这一行打上更新标记,查询的时候对于一个点x实际上就是x的子树中小于sz的层的贡献+x的子树中大于sz的层的贡献 小于sz的时候直接用树状数组+dfs序就可以维护 大于sz的时候实际上就是求子树中每层的节点个数*这一层增加的值,然后对这些层求和,每层增加的值直接用一个数组就可以维护,每层节点的个数我采用了一种log级的算法...

hao_zong_yin的博客 500

(银牌题)ACM-ICPC 2018 沈阳赛区网络预赛 J - Ka Chang dfs时间戳+树状数组+二分+分块

博客目录 原题   题目传送门  18.55%  1000ms  131072K Given a rooted tree ( the root is node 11 ) of NN nodes. Initially, each node has zero point. Then, you need to handle QQ operations. There're two types...

GreyBtfly的博客 1032

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树状数组+分块)

题目链接:https://nanti.jisuanke.com/t/31451 #include&lt;bits/stdc++.h&gt; using namespace std; #define debug puts("YES"); #define rep(x,y,z) for(int (x)=(y);(x)&lt;(z);(x)++) #define read(x,y) scanf("%...

满月照亮的路 205

ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang(树分块)

思路 因为不同深度的节点数量不同,数量少的节点,可以考虑直接进行单点更新,对于数量多的节点,可以直接记录这一层增加的值,查询的时候,看每一层有多少个节点,最后乘上增加的值就行了。 具体实现 先设定一个belong[maxn]数组,用于放同一层的节点的dfs序(这样做是为了可以在树状数组上进行单点更新,同一层的dfs序虽然不是连续的,但是也符合从小到大的顺序)。其次设定一个值block=1&l...

untilyouydc 427

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树状数组+分块)

题目链接:https://nanti.jisuanke.com/t/31451 题目大意:现在给出一棵包含n个结点的有根树,根节点为1,且根节点的深度为0。接下来进行q次操作,每次操作有以下两种操作: 1 L x :将深度为L的结点的值加上x; 2 x :查询x的子树所有结点的权值和。 题目思路:考虑到要查询子树,我们很容易就能想到用dfs序 + 树状数组来解决。对于修改操作,如果暴力去更...

Lee_w_j__的博客 313

ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang

Ka Chang 思路: dfs序+树状数组+分块 先dfs处理好每个节点的时间戳 对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新 如果这一层节点个数大于sqrt(n),那么直接存一下这一层每个节点的大小(都是一样的),这样的层数不会超过sqrt(n)层 然后查询的时候先在树状数组查询答案,然后再遍历第二种层数,加到答案中 复杂度:n*sqrt(...

weixin_34000916的博客 105

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树分块)

题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果每次都暴力维护子树上每一层的节点,则会超时. 要用分块来解决.对于节点数量小于\(\sqrt{N}\)的层数,用树状数组维护;否则将该层记录,修改时单独记录. 查询时,答案分成两份:树状数组中维护的子...

weixin_30682415的博客 134

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang

题目链接:https://nanti.jisuanke.com/t/31451 我参考的博客:https://blog.csdn.net/hao_zong_yin/article/details/82562210 这题写了两次,第二次写,我居然对这题没有一点印象,完全不知道以前写过...... 第二次的代码用了分块和二分,加上一堆vector。 题意:给出一棵有n个点的树,每个点的初始值都...

weixin_30768175的博客 70
上一篇: ACM-ICPC 2018 徐州赛区网络赛 G. Trace(线段树)
下一篇: 2014-2015 ACM-ICPC, Asia Xian Regional Contest G题The Problem to Slow Down You(回文树)
Timeclimber
博客等级 码龄9年 25粉丝 198原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值