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, you need to handle Q operations. There're two types:
1 L X: Increase points by X of all nodes whose depth equals L ( the depth of the root is zero ). (x≤108)
2 X: Output sum of all points in the subtree whose root is X.
Input
Just one case.
The first lines contain two integer, N,Q(N≤105,Q≤105).
The next n−1 lines: Each line has two integer aaa,bbb, means that node aaa is the father of node b. It's guaranteed that the input data forms a rooted tree and node 1 is the root of it.
The next Q lines are queries.
Output
For each query 2, you should output a number means answer.
样例输入
3 3
1 2
2 3
1 1 1
2 1
2 3
样例输出
1
0
题意
给你一颗以1为根节点的数,有两个操作
1.层数为L的节点增加X
2.查询以X为根节点的子树总权和
题解
操作2很容易想到dfs维护树状数组
对于操作1,可以把层数按sqrt(n)分块,对于层数点数<=block的直接暴力更新,对于>block先保存进数组ans,查询的时候二分左右区间可以知道根的节点数,再乘ans,这样可以把单次操作的复杂度固定在sqrt(n)范围内
代码
#include<bits/stdc++.h>
using namespace std; #define LL long long const int maxn=1e5+;
int s[maxn],e[maxn],tot,n;
LL sum[maxn],ans[maxn];
vector<int>G[maxn],deep[maxn],q;
void dfs(int u,int fa,int d)
{
s[u]=++tot;
deep[d].push_back(s[u]);
for(auto v:G[u])
{
if(v==fa)continue;
dfs(v,u,d+);
}
e[u]=tot;
}
int lowbit(int x)
{
return x&(-x);
}
void update(int x,int add)
{
for(int i=x;i<=n;i+=lowbit(i))
sum[i]+=add;
}
LL query(int x)
{
LL ans=;
for(int i=x;i>;i-=lowbit(i))
ans+=sum[i];
return ans;
}
int main()
{
int Q,op,L,x,u,v;
scanf("%d%d",&n,&Q);
int block=sqrt(n);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,-,);
for(int i=;i<n;i++)
if(deep[i].size()>block)q.push_back(i);
for(int i=;i<Q;i++)
{
scanf("%d",&op);
if(op==)
{
scanf("%d%d",&L,&x);
if(deep[L].size()>block)ans[L]+=x;
else
{
for(auto X:deep[L])
update(X,x);
}
}
else
{
scanf("%d",&x);
LL res=query(e[x])-query(s[x]-);
for(auto pos:q)
res+=ans[pos]*(upper_bound(deep[pos].begin(),deep[pos].end(),e[x])-lower_bound(deep[pos].begin(),deep[pos].end(),s[x]));
printf("%lld\n",res);
}
}
return ;
}
ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树状数组+分块)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树分块)
题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块思想)
题目链接:https://nanti.jisuanke.com/t/31451 题意: 给你一颗树,树上各点有初始权值,你有两种操作: 1. 给树中深度为l的点全部+x,(根节点为1,深度为0) 2. ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang
Ka Chang 思路: dfs序+树状数组+分块 先dfs处理好每个节点的时间戳 对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新 如果这一层节点个数大于sqrt ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)
题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...
- ACM-ICPC 2018 徐州赛区网络预赛 G. Trace【树状数组维护区间最大值】
任意门:https://nanti.jisuanke.com/t/31459 There's a beach in the first quadrant. And from time to time, ...
- 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 ...
- ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer (最大生成树+LCA求节点距离)
ACM-ICPC 2018 徐州赛区网络预赛 J. Maze Designer J. Maze Designer After the long vacation, the maze designer ...
- ACM-ICPC 2018 沈阳赛区网络预赛 K Supreme Number(规律)
https://nanti.jisuanke.com/t/31452 题意 给出一个n (2 ≤ N ≤ 10100 ),找到最接近且小于n的一个数,这个数需要满足每位上的数字构成的集合的每个非空子集 ...
- 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 ...
随机推荐
- WPF 自定义鼠标光标
在程序中使用自定义鼠标光标的三种方式: RadioButton senderButton = sender as RadioButton; 方式一: str ...
- fb发布打包外部资源
将资源放在src文件夹下面即可 然后在打包那就会看到资源,勾上即可
- virtualBox下Centos系统扩展LVM磁盘空间
工具准备:下载Gparted Live CD,一个分区管理工具(根据安装的32,64位版本选择对应链接).https://sourceforge.net/projects/gparted/files/ ...
- linux中根据进程的PID值来查找执行文件的及其路径
lsof -p PID http://blog.csdn.net/great_smile/article/details/50114133
- 修改页面中显示出需要修改的数据(包括select选择框复显示)
页面中需要用到某个对象时,在底层代码中赋值,然后页面用java代码进行获取调用 如下截图: select复显示:根据后台方法赋值选择框 ,并设置初始值 按钮及选择框的禁用(五种方法): 方法一: $( ...
- eclipse中导入java类失败的问题
在 Eclips 开发时,新建了一个 Dynamic Web Project,在运行jsp文件时tomcat报错: org.apache.jasper.JasperException: Unable ...
- Zookeeper 3、Zookeeper工作原理(转)
1.Zookeeper的角色 » 领导者(leader),负责进行投票的发起和决议,更新系统状态 » 学习者(learner),包括跟随者(follower)和观察者(observer),follow ...
- Linux:回收循环创建的多个线程
上午我说了循环创建多个线程,由于进程与线程是如此的相似,进程我们知道要回收,那么线程也自然要回收啦.我们接着看控制原语: 线程与共享 线程间共享全局变量! [牢记]:线程默认共享数据段.代码段等地址空 ...
- 点击li往数组添加对应li的id再点击移除,根据是否有class判断
if($(this).hasClass('click')){ $(this).removeClass('click'); var idAPP = $(this).attr('id'), index = ...
- java实现excel表格导出
Java 实现导出excel表 POI 1.首先下载poi-3.6-20091214.jar,下载地址如下: http://download.csdn.net/detail/evangel_z/389 ...