ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang (树分块)
题意:一个树,支持两种操作: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 (树分块)的更多相关文章
- ACM-ICPC 2018 沈阳赛区网络预赛 J. Ka Chang  (分块思想)
		
题目链接:https://nanti.jisuanke.com/t/31451 题意: 给你一颗树,树上各点有初始权值,你有两种操作: 1. 给树中深度为l的点全部+x,(根节点为1,深度为0) 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 ...
 - 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 沈阳赛区网络预赛 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. ...
 
随机推荐
- ulimit命令学习
			
通过ulimit -n命令可以查看linux系统里打开文件描述符的最大值,一般缺省值是1024,对一台繁忙的服务器来说,这个值偏小,所以有必要重新设置linux系统里打开文件描述符的最大值.那么应该在 ...
 - WPF进阶之接口(4):ICommand实现详解
			
上一章WPF进阶之接口():INotifyPropertyChanged,ICommand中我们遗留了几个问题,我将在本节中做出解释.在详细解释ICommand实现之前,我们现在关注一下什么是:弱引用 ...
 - 如何隐藏js
			
前端好像一直会遇到js容易被查看的问题,针对这种情况,如何隐藏js呢? 突发奇想,想到一个办法,如果说一段js只需要执行一次的话 可以尝试在所有js加载操作完毕后把它去掉.看代码 <!DOCTY ...
 - UE4与Visual Studio版本对应关系
			
首先,要注意,Visual Studio 2015(VS2015)默认安装时并不包含 C++ 的工具.在安装 VS2015 时,需选择 自定义 安装并勾选 C++ 组件,这对之后的工作时必须的.如果已 ...
 - 自定义控件_StickyNavLaout
			
关注我一.View结构原理1.extends linearLayout 继承想要用的布局,首先完成布局的填充在 onFinishInflate 方法中 findViewById(); @Overrid ...
 - python3-requests库的使用
			
同步请求库requests用来做测试和简单爬虫其实非常好用的,今天来讲一讲,毕竟不熟悉就用,吃了很大亏啊,文档一定要好好看 http://docs.python-requests.org/zh_CN/ ...
 - 常用 Git 操作
			
最新博客链接:https://feiffy.cc/Git 日常用到的GIT的一些操作,记下来,以备参考. 删除文件 git rm filename git commit -m "remove ...
 - Servlet------>jsp自定义标签1(简单入门)
			
自定义标签能做什么: 1.移除java代码 2.控制jsp页面某一部分是否执行 3.控制整个jsp是否执行 3.jsp内容重复输出 4.修改jsp内容输出 效果: 首先先写好实现这个标签的java类, ...
 - 轻松六步教会你如何修改system.img.ext4文件
			
http://bbs.xiaomi.cn/thread-2943923-1-1.html 希望更多的ROM作者,看了此教程后,学会ROM制作,给大家带来更多更好的ROM 首先下载如下包 Linux U ...
 - Systemd mysql,nginx,php启动配置文件
			
systemctl的配置文件目录一般在 /usr/lib/systemd/system/ 或者/etc/systemd/system/ 需要注意的是,nginx与php运行用户必须是root,所以不需 ...