题意:一个树,支持两种操作:1.将深度为L的节点权置加上X;2.求以x为根节点的子树上节点权置之和.根节点深度为0.

分析:考虑用树状数组维护节点权置,按dfs序下标查询.记录每个深度节点的个数.如果每次都暴力维护子树上每一层的节点,则会超时.

要用分块来解决.对于节点数量小于\(\sqrt{N}\)的层数,用树状数组维护;否则将该层记录,修改时单独记录.

查询时,答案分成两份:树状数组中维护的子树区间的和;以及属于根为所查节点x子树,且层号是超过\(\sqrt{N}\)的节点的权置和.后者查询时,对每一个超过\(\sqrt{N}\)的层号,求其层中节点在x子树区间中的节点权置之和.

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int MAXN = 2e5+5;
struct Edge{
int v,next;
}edges[MAXN<<1];
int head[MAXN], tot,N,deep,dfs_cnt;
int L[MAXN],R[MAXN];
LL bit[MAXN<<1];
vector<int> dp[MAXN];
vector<int> bg; void init(){
memset(bit,0,sizeof(bit));
memset(head,-1,sizeof(head));
tot =0;
deep = dfs_cnt = 0;
} void AddEdge(int u,int v){
edges[tot] = (Edge){v,head[u]};
head[u] = tot++;
} void add(int pos,LL val){
for(int i=pos; i<=N; i+= (i&-i)) bit[i] += val;
} LL sum(int pos)
{
LL res=0;
for(int i=pos; i ;i-= (i&-i)) res+= bit[i];
return res;
} void dfs(int u,int fa,int d)
{
L[u] = ++ dfs_cnt;
deep = max(deep,d);
dp[d].push_back(L[u]);
for(int i=head[u];~i;i=edges[i].next){
int v = edges[i].v;
if(v!=fa) dfs(v,u,d+1);
}
R[u] = dfs_cnt;
}
LL ans[MAXN]; int main()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
freopen("out.txt","w",stdout);
#endif
int Q,op,u,v,tmp;
scanf("%d %d",&N, &Q);
init();
memset(ans,0,sizeof(ans));
bg.clear();
for(int i=0;i<=N;++i) dp[i].clear(); for(int i=1;i<=N-1;++i){
scanf("%d %d",&u,&v);
AddEdge(u,v), AddEdge(v,u);
}
dfs(1,-1,0);
int block = sqrt(1.0*N);
for(int i=0;i<=deep;++i){ //该层节点大于sqrt(n)的单独保存
if(dp[i].size()>block) bg.push_back(i);
}
while(Q--){
scanf("%d",&op);
if(op==1){
int lev; LL x;
scanf("%d %lld",&lev, &x);
if(dp[lev].size()>block){ //节点数大的打上标记
ans[lev] += x;
}
else{ //该层节点数小的直接暴力更新.
int siz = dp[lev].size();
for(int i=0;i<siz;++i){
add(dp[lev][i],x);
}
}
}
else{
scanf("%d",&u);
LL res = sum(R[u]) - sum(L[u]-1); //先求层数小的节点和
int siz = bg.size();
for(int i=0;i<siz;++i){
int lev = bg[i];
res += (upper_bound(dp[lev].begin(),dp[lev].end(),R[u])-
lower_bound(dp[lev].begin(),dp[lev].end(),L[u]))*ans[lev];
}
printf("%lld\n",res);
}
}
return 0;
}

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

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

    题目链接:https://nanti.jisuanke.com/t/31451 题意: 给你一颗树,树上各点有初始权值,你有两种操作: 1. 给树中深度为l的点全部+x,(根节点为1,深度为0) 2. ...

  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

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

  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. expected_conditions判断页面元素

    expected_condtions提供了16种判断页面元素的方法: 1.title_is:判断当前页面的title是否完全等于预期字符串,返回布尔值 2.title_contains:判断当前页面的 ...

  2. Kafka+SpringMVC+Maven应用示例

    本文借助主流SpringMVC框架向大家介绍如何在具体应用中简单快捷的使用kafka.kafka.maven以及SpringMVC在现在的企业级应用中都占据着非常重要的地位,所以本文将三者结合起来也可 ...

  3. python 学习源

    入门 w3cschool https://www.w3cschool.cn/python/ 菜鸟教程(支持在线编程) http://www.runoob.com/python/python-tutor ...

  4. SpringMVC笔记——Spring+MyBatis组合开发简单实例

    简介 SSH框架很强大,适合大型项目开发.但学无止境,多学会一门框架组合开发会让自己增值许多. SSM框架小巧精致,适合中小型项目快速开发,对于新手来说也是简单上手的.在SSM框架搭建之前,我们先学习 ...

  5. Angular2+学习第1篇 简介

    历史: Angular是Google推出的Web前端开发框架,从12年发布起就受到了强烈的关注,他首次提出了双向绑定的概念,让人耳目一新. Angular 2特性 就在2016年9月中旬,时隔4年,G ...

  6. poj3666 Making the grade【线性dp】

    Making the Grade Time Limit: 1000MS   Memory Limit: 65536K Total Submissions:10187   Accepted: 4724 ...

  7. CentOS6.7 通过yum在线安装MySQL5.7

    一.安装1.检测系统是否自带安装mysql yum list installed | grep mysql 发现系统自带依赖库:mysql-libs.x86_64 2.删除系统自带的mysql及其依赖 ...

  8. android mock location

    原理:用 setTestProviderLocation 设置模拟gps的位置 http://androidcookbook.com/Recipe.seam?recipeId=1229 http:// ...

  9. SaaS成熟度模型分级:

    SaaS成熟度模型分级: 根据SaaS应用是否具有可配置性,高性能,可伸缩性的特性,SaaS成熟度模型被分成四级.每一级都比前一级增加三中特性中的一种.   可配置 高性能 可伸缩 Level1 N ...

  10. UEFI,BIOS,MBR,

    UEFI启动是一种新的主板引导项,正被看做是有近20多年历史的BIOS 的继任者.顾名思义,快速启动是可以提高开机后操作系统的启动速度.由于开机过程中UEFI的介入 第一:安全性更强 UEFI启动需要 ...