题意:

给定一颗树,初始状态下树上所有节点的权值为0。两种操作,第一种操作,将深度为x的所有节点权值加k;第二种操作,统计一个节点下面所有子节点的权值之和。

思路:

本题可以直接进行分块操作。

先维护一个dfs序,因为dfs序上可以找到一个节点的所有子节点,然后分500块,每块大小为200,对每一块维护一个数组,表示在该分块下,深度为 i 的点有多少个。

然后再维护每一个块的权值之和,表示这个分块内的所有节点的权值之和。对于第一种操作,每次操作500次,对于每一个块都进行更新。

对于第二个操作,在dfs序的数组上进行操作,对最开始的分块和最后的分块进行暴力枚举,对中间的块直接加上之前维护的每一个块的权值之和即可。

本题听说还有一个进阶操作,就是每次更新区间 [l,r] 上的所有节点的权值,然后操作二不变,这种情况下的话貌似要用kd树解决,留坑......

代码:

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#define rep(i,a,b) for(int i = a;i <= b;i++)
using namespace std;
const int N = 1e5+10;
typedef long long ll;int a[210][N];
int siz[N],deep[N];
ll val[N];
ll mody[N];
int dfs[N],td;
int andfs[N];
int n,q;
struct Edge{int to,next;
}e[2*N];
int head[N],tot;void init()
{tot = 1;td = 0;
}void add(int x,int y)
{e[++tot].to = y, e[tot].next = head[x], head[x] = tot;
}void solve(int s,int dpt)
{dfs[++td] = s;andfs[s] = td; //s点对应dfs中的点siz[s] = 1;deep[s] = dpt;for(int i = head[s]; i ; i = e[i].next){int y = e[i].to;solve(y,dpt+1);siz[s] += siz[y];}
}void solve1()
{rep(i,1,td){int id = (i-1)/500;id++;int x = dfs[i];a[id][deep[x]]++;}
}void cal(int dpt,ll k)
{int pos = 1;while(pos <= td){int id = (pos-1)/500;id++;val[id] += (long long)a[id][dpt]*k;pos += 500;}
}void cal1(int p)
{int x = andfs[p];int y = x+siz[p]-1;ll ans = 0;ans += mody[deep[p]];int l = (x-1)/500;int r = (y-1)/500;l++, r++;for(int i = l+1; i < r; i++)ans += val[i];if(l == r){for(int i = x+1; i <= y; i++){ans += mody[deep[dfs[i]]];}}else{for(int i = x+1; i <= l*500; i++)ans += mody[deep[dfs[i]]];r = (r-1)*500+1;for(int i = r; i <= y; i++)ans += mody[deep[dfs[i]]];}printf("%lld\n",ans);
}int main()
{init();scanf("%d%d",&n,&q);rep(i,1,n-1){int x,y;scanf("%d%d",&x,&y);add(x,y);}solve(1,0);solve1();rep(i,1,q){int x;scanf("%d",&x);if(x == 1) //深度为{int y;ll z;scanf("%d%lld",&y,&z);mody[y] += z;cal(y,z);}else{int y;scanf("%d",&y);cal1(y);}}return 0;
}//200个块/*
13 100
1 2
1 3
2 4
2 5
3 6
3 7
7 8
7 9
9 10
9 11
10 12
10 13*/

【树上分块】【dfs序】2018沈阳网络赛 —— J题相关推荐

  1. 2018沈阳网络赛:J kachang KD树

    把每个点建立(dfs序,depth),所有操作和查询转化为矩形操作,用KD树就可以 n(√n) n ( n ) n\sqrt(n)完成了. #include <bits/stdc++.h> ...

  2. 2018沈阳网络赛J

    给一颗树,两种操作,一种把同一层的点权值加上v,另一种求一点下的子树权值和. 按层数中点个数分块,小块直接暴力把所有点用bit更新,大块把层的值存下来. 询问的时候子树权值和为bit中的值以及其下面的 ...

  3. 2018南京网络赛 j题 sum

    代码1: #include<bits/stdc++.h>using namespace std; typedef long long ll; const int N =2e7+5; boo ...

  4. hdu5459(2015沈阳网络赛J题)

    题意: 给出一个类似于斐波那契数组的字符串的定义,给出一个n,让求第n个串中任意两个c的距离的和. 思路: 我们用了三个小时找规律,最后发现是递推... 代码: #include <cstdio ...

  5. 乌鲁木齐网络赛J题(最小费用最大流模板)

    ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报  分类: 网络流(33)  版权声 ...

  6. luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节

    luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...

  7. 2017乌鲁木齐网络赛 j 题

    题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...

  8. 2018沈阳网络赛D

    k短路模板题. #include <bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x ...

  9. HDU - 5877 Weak Pair 2016 ACM/ICPC 大连网络赛 J题 dfs+树状数组+离散化

    题目链接 You are given a rootedrooted tree of NN nodes, labeled from 1 to NN. To the iith node a non-neg ...

  10. hdu5461(2015沈阳网络赛L题)

    题意: 给出一个数列,我们要在这里找出两个数,使得题意中那个表达式最大. 思路: 排两个序就好了啊,看代码一下就懂了. 代码: #include <cstdio> #include < ...

最新文章

  1. smarty mysql_Smarty处理mysql查询数组
  2. 在嘴巴里放入124 个传感器,谷歌眼镜创始人新项目:用舌头发信息
  3. Symantec Backup Exec System Recovery还原向导
  4. 使用Qt创建XML文档及XML文档的增删改
  5. HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法
  6. PostgreSQL 9.2迁移到9.3
  7. Work Queue based multi-threading
  8. html类名定义规则_HTML入门笔记1
  9. java long bigdecimal,通过Java中的long创建BigDecimal值
  10. Akka创建第一个Actor《nine》译
  11. 大厂程序员手把手教你如何写简历(附简历模板)
  12. 【JS跨域取XML】之——借助AS的URLLoader
  13. 探索艾利特机器人丨EC66在物流行业的应用
  14. 计算机视觉—车道线检测
  15. 我了解的软件测试总结
  16. FastReport VCL 2022.3
  17. 分享100个精美的作品集网站设计案例
  18. 微信单删和互删有什么区别?
  19. 智能驾驶感知大战全面打响,谁在引领视觉技术的革新?
  20. bootstrapvalidator已定义的验证规则

热门文章

  1. 一起谈.NET技术,VS2010 测试功能之旅:编码的UI测试(4)-通过编写测试代码的方式建立UI测试(下)...
  2. [导入]Asp.Net 学习资源列表
  3. 第一个Jsp程序,Hello World
  4. WordPress 下载量最高的十个插件
  5. 自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)
  6. python升级导致yum命令无法使用的解决办法(修改版)
  7. 0字符串 if mapper test_降龙-第20章:Mapper解析
  8. matlab畸变程度计算,matlab 畸变校正代码
  9. OpenCV : 投影变换
  10. C/C++[codeup 1944]八进制