【树上分块】【dfs序】2018沈阳网络赛 —— J题
题意:
给定一颗树,初始状态下树上所有节点的权值为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题相关推荐
- 2018沈阳网络赛:J kachang KD树
把每个点建立(dfs序,depth),所有操作和查询转化为矩形操作,用KD树就可以 n(√n) n ( n ) n\sqrt(n)完成了. #include <bits/stdc++.h> ...
- 2018沈阳网络赛J
给一颗树,两种操作,一种把同一层的点权值加上v,另一种求一点下的子树权值和. 按层数中点个数分块,小块直接暴力把所有点用bit更新,大块把层的值存下来. 询问的时候子树权值和为bit中的值以及其下面的 ...
- 2018南京网络赛 j题 sum
代码1: #include<bits/stdc++.h>using namespace std; typedef long long ll; const int N =2e7+5; boo ...
- hdu5459(2015沈阳网络赛J题)
题意: 给出一个类似于斐波那契数组的字符串的定义,给出一个n,让求第n个串中任意两个c的距离的和. 思路: 我们用了三个小时找规律,最后发现是递推... 代码: #include <cstdio ...
- 乌鲁木齐网络赛J题(最小费用最大流模板)
ACM ICPC 乌鲁木齐网络赛 J. Our Journey of Dalian Ends 2017-09-09 17:24 243人阅读 评论(0) 收藏 举报 分类: 网络流(33) 版权声 ...
- luogu 1327 数列排序 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛 J题 循环节
luogu 1327 数列排序 题意 给定一个数列\(\{an\}\),这个数列满足\(ai≠aj(i≠j)\),现在要求你把这个数列从小到大排序,每次允许你交换其中任意一对数,请问最少需要几次交换? ...
- 2017乌鲁木齐网络赛 j 题
题目连接 : https://nanti.jisuanke.com/t/A1256 Life is a journey, and the road we travel has twists and t ...
- 2018沈阳网络赛D
k短路模板题. #include <bits/stdc++.h> #define mem(x) memset(x,0,sizeof(x)) #define mem1(x) memset(x ...
- 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 ...
- hdu5461(2015沈阳网络赛L题)
题意: 给出一个数列,我们要在这里找出两个数,使得题意中那个表达式最大. 思路: 排两个序就好了啊,看代码一下就懂了. 代码: #include <cstdio> #include < ...
最新文章
- smarty mysql_Smarty处理mysql查询数组
- 在嘴巴里放入124 个传感器,谷歌眼镜创始人新项目:用舌头发信息
- Symantec Backup Exec System Recovery还原向导
- 使用Qt创建XML文档及XML文档的增删改
- HDU 2255 奔小康赚大钱 带权二分图匹配 KM算法
- PostgreSQL 9.2迁移到9.3
- Work Queue based multi-threading
- html类名定义规则_HTML入门笔记1
- java long bigdecimal,通过Java中的long创建BigDecimal值
- Akka创建第一个Actor《nine》译
- 大厂程序员手把手教你如何写简历(附简历模板)
- 【JS跨域取XML】之——借助AS的URLLoader
- 探索艾利特机器人丨EC66在物流行业的应用
- 计算机视觉—车道线检测
- 我了解的软件测试总结
- FastReport VCL 2022.3
- 分享100个精美的作品集网站设计案例
- 微信单删和互删有什么区别?
- 智能驾驶感知大战全面打响,谁在引领视觉技术的革新?
- bootstrapvalidator已定义的验证规则
热门文章
- 一起谈.NET技术,VS2010 测试功能之旅:编码的UI测试(4)-通过编写测试代码的方式建立UI测试(下)...
- [导入]Asp.Net 学习资源列表
- 第一个Jsp程序,Hello World
- WordPress 下载量最高的十个插件
- 自增字段不连续_MySQL中自增主键不连续之解决方案。(20131109)
- python升级导致yum命令无法使用的解决办法(修改版)
- 0字符串 if mapper test_降龙-第20章:Mapper解析
- matlab畸变程度计算,matlab 畸变校正代码
- OpenCV : 投影变换
- C/C++[codeup 1944]八进制