ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (分块思想)
题目链接: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 (分块思想)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 J Ka Chang
Ka Chang 思路: dfs序+树状数组+分块 先dfs处理好每个节点的时间戳 对于每一层,如果这一层的节点数小于sqrt(n),那么直接按照时间戳在树状数组上更新 如果这一层节点个数大于sqrt ...
- 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 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树分块)
题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0. 分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果 ...
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang(树上分块+dfs序+线段树)
题意 链接:https://nanti.jisuanke.com/t/A1998 给出一个有根树(根是1),有n个结点.初始的时候每个结点的值都是0.下面有q个操作,操作有两种,操作1.将深度为L(根 ...
- 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 ...
- 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. ...
随机推荐
- 15-(基础入门篇)GPRS(Air202)GPIO控制点亮一个灯
https://www.cnblogs.com/yangfengwu/p/9967027.html 现在点亮它,说一下哈,都过去好久了,不知道大家都在用哪个版本的库 http://www.openlu ...
- BZOJ 2784 时间流逝
BZOJ 2784 时间流逝 古典概率论... 可以发现由于能量圈数量限制,所以所构成的必定为树状结构(即便是转成最小能量圈和能量圈权值和之后存在重复状态,但是每个状态的含义不同,而且不能自身转移自身 ...
- bitcoin 源码解析 - 交易 Transaction(三) - Script
bitcoin 源码解析 - 交易 Transaction(三) - Script 之前的章节已经比较粗略的解释了在Transaction体系当中的整体运作原理.接下来的章节会对这个体系进行分解,比较 ...
- 校内模拟赛 Zbq's Music Challenge
Zbq's Music Challenge 题意: 一个长度为n的序列,每个位置可能是1或者0,1的概率是$p_i$.对于一个序列$S$,它的得分是 $$BasicScore=A\times \sum ...
- 分布式系统session一致性的问题
session的概念 什么是session? 服务器为每个用户创建一个会话,存储用户的相关信息,以便多次请求能够定位到同一个上下文.这样,当用户在应用程序的 Web 页之间跳转时,存储在 Sessio ...
- 插件GsonFormat快速生成JSon实体类
IntelliJ IDEA 个人觉得是目前最好最强最智能的Java IDE,默认已经集成了几乎所有主流的开发工具和框架. 1.常用工具支持Java日常开发需要接触到很多常用的工具,为了便于使用,很多工 ...
- ANSYS附加动水质量(westergarrd公式)
在水工结构的抗震计算中,不可避免的需要考虑动水压力的作用,当前规范中一般是要求将动水压力以附加质量的形式考虑,如果对压力用质量形式考虑有疑惑时,可以这样理解:结构发生振动时,会带动周围的水体发生运动, ...
- 最小生成树模板题POJ - 1287-prim+kruskal
POJ - 1287超级模板题 大概意思就是点的编号从1到N,会给你m条边,可能两个点之间有多条边这种情况,求最小生成树总长度? 这题就不解释了,总结就算,prim是类似dijkstra,从第一个点出 ...
- 个人实验 github地址:https://github.com/quchengyu/cher
一.实践目的 1.掌握类的定义,对象的创建. 2.掌握实现封装.继承.多态的方法,掌握各种修饰符的使用. 3.掌握将对象数组作为方法的参数和返回值. 4.掌握抽象类与接口的概念及实现,理解动态绑定机制 ...
- 猜字游戏java
一.实践目的 1.掌握基本输入输出. 2.掌握方法定义与调用,理解参数传递方式. 3.掌握数组的声明.定义与初始化,数组的处理. 4.掌握数组作为方法参数和返回值. 二.实践要求 利用方法.数组.基本 ...