题目链接:https://nanti.jisuanke.com/t/31451

题意:

给你一颗树,树上各点有初始权值,你有两种操作:

1. 给树中深度为l的点全部+x,(根节点为1,深度为0)

2.求出以x为根的子树权值和

思路:

因为第一个操作是对一整层的树节点+x,那么我们可以很容易的标记每一层一共加了多少权值,那么子树增加的就是以x为根到叶子节点每一层增加的值之和乘以这颗子树当前层的节点数,我们可以用二分快速找到每一层的节点个数,但是我们还是会发现,这样每一次操作极限时间复杂度还是很高,我们要尽量将它在优化下,我们可以发现如果当前层节点数较少的情况下,上面的方法并不是很优越,那么对节点数少小的层我们可以直接用bit更新,复杂度会优越很多,判断的界限直接设为sqrt(n),类似分块的思维,小一点的bit更新,大的标记数组,这样我们每一次询问某个树的子树权值和就把标记数组和bit中的值加起来就好了。

实现代码:

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int M = 2e5+; int in[M],out[M],n,cnt,tot,head[M],dep;
ll ans[M],c[M<<];
vector<int>d[M];
vector<int>q;
struct node{
int to,next;
}e[M]; void add(int u,int v){
e[++cnt].to = v;e[cnt].next = head[u];head[u] = cnt;
} void dfs(int u,int fa,int deep){
dep = max(dep,deep); //最大层数
in[u] = ++tot;
d[deep].push_back(in[u]); //每一层分别有哪些节点
for(int i = head[u];i;i=e[i].next){
int v = e[i].to;
if(v == fa) continue;
dfs(v,u,deep+);
}
out[u] = tot;
} void add(int x,ll v){
while(x <= n){
c[x] += v;
x += (x&-x);
}
} ll getsum(int x){
ll ret = ;
while(x){
ret += c[x];
x -= (x&-x);
}
return ret;
} int main()
{
int m,x,u,v,block;
ll y;
tot = ;cnt = ;
scanf("%d%d",&n,&m);
for(int i = ;i < n;i ++){
scanf("%d%d",&u,&v);
add(u,v); add(v,u);
}
dep = ;
dfs(,,);
block = sqrt(n);
for(int i = ;i <= dep;i ++){
if(d[i].size()>block) q.push_back(i); //把大的块的编号存起来
}
int op;
while(m--){
scanf("%d",&op);
if(op == ){
scanf("%d%lld",&x,&y);
if(d[x].size() > block) ans[x] += y; //大的块标记数组
else{
for(int i = ;i < d[x].size();i++) //小的块bit更新
add(d[x][i],y);
}
}
else {
scanf("%d",&x);
ll num = getsum(out[x]) - getsum(in[x]-); //小的块的值
for(int i = ;i < q.size();i ++){
num += 1LL*(upper_bound(d[q[i]].begin(),d[q[i]].end(),out[x])-lower_bound(d[q[i]].begin(),d[q[i]].end(),in[x]))*ans[q[i]]; //每次层的数量*这一层标记数组的值
}
printf("%lld\n",num);
}
}
return ;
}

ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块思想)的更多相关文章

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

    Ka Chang 思路: dfs序+树状数组+分块 先dfs处理好每个节点的时间戳 对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新 如果这一层节点个数大于sqrt ...

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

    Given a rooted tree ( the root is node 1 ) of N nodes. Initially, each node has zero point. Then, yo ...

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

    题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果 ...

  4. ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)

    题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...

  5. ACM-ICPC 2018 沈阳赛区网络预赛 J树分块

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

  6. ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)

    ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...

  7. ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)

    https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...

  8. ACM-ICPC 2018 沈阳赛区网络预赛-K:Supreme Number

    Supreme Number A prime number (or a prime) is a natural number greater than 11 that cannot be formed ...

  9. ACM-ICPC 2018 沈阳赛区网络预赛-D:Made In Heaven(K短路+A*模板)

    Made In Heaven One day in the jail, F·F invites Jolyne Kujo (JOJO in brief) to play tennis with her. ...

随机推荐

  1. linux笔记 - 配置与编译

    linux内核下载地址:https://www.kernel.org/ ubuntu下载内核对应源码: sudo apt-get source linux-$(uname -r) #此命令下载的源码存 ...

  2. excel保存为制表符分隔的文本文件 js无法完整读取

    excel保存为制表符分隔的文本文件 js无法完整读取 excel另存为文本有两个选项,一个是制表符分隔的文本文件,一个是unicode文本.生成的文件Unicode更大一些.但是这里需要注意的是[制 ...

  3. Nowcoder186C 失衡天平 背包

    题目传送门 题意:给你$N$个数,你可以将其划分为若干对集合(这里所说的集合允许数字重复)(即集合是两个集合两个集合出现),每对集合中两个集合所有元素的和的差的绝对值不超过$M$,可以有数字不在集合内 ...

  4. 2011 noip 提高组

    首先吐槽:刚刚写着写着突然蓝屏了,,emmm,写到最后一题了蓝屏了. 当时我的内心是崩溃的. 然后,旁边的大佬默默来了一句:论保存草稿的重要性. 连着蓝了三次之后开了防火墙,然后,,我左边那位同学又开 ...

  5. Centos7 -- glibc 升级失败、意外删除、故意删除后的处理方法

    第一部分:测试(如果不是想测试效果,可以直接跳到第三部分) 鉴于不久前 glibc-2.29 升级失败导致一系列的工具无法正常使用,‘’ 本着研究精神的我决定删除 glibc及其库文件 ,测试影响范围 ...

  6. Item 9: 比起typedef更偏爱别名声明(alias declaration)

    本文翻译自modern effective C++,由于水平有限,故无法保证翻译完全正确,欢迎指出错误.谢谢! 博客已经迁移到这里啦 我确信我们都同意使用STL容器是一个好主意,并且我希望在Item ...

  7. WEB 小案例 -- 网上书城(四)

    针对于这个小案例我们今天讲解结账操作,也是有关这个案例的最后一次博文,说实话这个案例的博文写的很糟糕,不知道该如何去表述自己的思路,所以内容有点水,其实说到底还是功力不够. 处理思路 点击结账,发送结 ...

  8. oracle如何导出和导入数据库/表

    oracle如何导出和导入数据库/表 oracle如何将项目中的表导出后在导入自己的数据库中,这是一个完整的操作,对于数据库备份或在本地查看数据验证数据进场用到,一般情况下我都用dos黑窗口进行操作, ...

  9. 《Linux内核分析》第六周学习小结

    进程的描述和进程的创建 一.进程的描述 进程描述符task_struct数据结构: (1)操作系统的三大功能: 进程管理.内存管理.文件系统 (2)进程的作用: 将信号.进程间通信.内存管理和文件系统 ...

  10. <<梦断代码>>阅读笔记一

    没有想象中的枯燥,甚至有些有趣.这就是我对<梦断代码>这一本书的第一印象.而且,作为一本面向程序员的书籍,作者很有意义地从第0章开始,那我也从第0章开始说.这第一次读书笔记是针对0~2 章 ...