bzoj4034 树上操作 树链剖分+线段树
题目大意:
#include<cstdio>
#include<algorithm>
//#include<iostream>
#include<vector>
#include<map>
#include<set>
#include<cstring>
#include<queue>
#include<stack>
#include<stdlib.h>
//#include<unordered_map>
#define lson (o<<1)
#define rson ((o<<1)|1)
#define CLR(a,b) memset(a,b,sizeof(a))
#define mkp(a,b) make_pair(a,b)
typedef long long ll;
using namespace std;
const int maxn=;
vector<int> edge[maxn];
int n,m,op,x,tot,val[maxn],l[maxn],r[maxn],deep[maxn],son[maxn],fa[maxn],top[maxn],fin[maxn];
ll sum[maxn<<],lazy[maxn<<],size[maxn<<];
inline void dfs_1(int x,int pre)
{
fa[x] = pre;
son[x] = -;
size[x] = ;
deep[x] = deep[pre]+;
for(int i = ; i < edge[x].size(); i++)
if(edge[x][i] != pre)
{
dfs_1(edge[x][i],x);
size[x] += size[edge[x][i]];
if(son[x]==- || size[edge[x][i]]>size[son[x]]) son[x] = edge[x][i];
}
}
inline void dfs_2(int x,int root)
{
top[x] = root;
l[x] = ++tot;
fin[l[x]] = x;
if(son[x] != -)
dfs_2(son[x],root);
for(int i = ; i < edge[x].size(); i++)
if(edge[x][i] != fa[x] && edge[x][i] != son[x])
dfs_2(edge[x][i],edge[x][i]);
r[x]=tot;
}
inline void maintain(int o,int l,int r)
{
if(l!=r)sum[o]=sum[lson]+sum[rson];
}
inline void pushdown(int o,int l,int r)
{
if(lazy[o])
{
sum[lson]+=size[lson]*lazy[o];
sum[rson]+=size[rson]*lazy[o];
lazy[lson]+=lazy[o];
lazy[rson]+=lazy[o];
}
lazy[o]=;
}
inline void build(int o,int l,int r)
{
if(l==r)
{
sum[o]=(ll)val[fin[l]];
size[o]=;
return;
}
int mid = (l+r)/;
build(lson,l,mid);
build(rson,mid+,r);
maintain(o,l,r);
size[o]=size[lson]+size[rson];
}
inline void update(int o,int l,int r,int L,int R,int v)
{
pushdown(o,l,r);
if(R<l || L>r)return;
if(l>=L && r<=R)
{
lazy[o]+=(ll)v;
sum[o]+=((ll)size[o])*((ll)v);
return;
}
int mid=(l+r)>>;
update(lson,l,mid,L,R,v);
update(rson,mid+,r,L,R,v);
maintain(o,l,r);
}
inline ll query(int o,int l,int r,int L,int R)
{
pushdown(o,l,r);
if(R<l || L>r)return ;
if(l>=L && r<=R)return sum[o];
int mid=(l+r)>>;
return query(lson,l,mid,L,R)+query(rson,mid+,r,L,R);
}
inline ll get(int x)
{
ll ret = ;
while(top[x]!=)
{
ret+=query(,,n,l[top[x]],l[x]);
x=fa[top[x]];
}
ret+=query(,,n,,l[x]);
return ret;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i = ; i <= n; i++)
scanf("%d",&val[i]),sum[i]=i;
int u,v;
for(int i = ; i < n; i++)
{
scanf("%d%d",&u,&v);
edge[u].push_back(v);
edge[v].push_back(u);
}
dfs_1(,);
dfs_2(,);
build(,,n);
for(int i = ; i < m; i++)
{
scanf("%d%d",&op,&x);
if(op==)
{
scanf("%d",&v);
update(,,n,l[x],l[x],v);
}
if(op==)
{
scanf("%d",&v);
update(,,n,l[x],r[x],v);
}
if(op==)printf("%lld\n",get(x));
}
return ;
}
bzoj4034 树上操作 树链剖分+线段树的更多相关文章
- BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 )
BZOJ.4034 [HAOI2015]树上操作 ( 点权树链剖分 线段树 ) 题意分析 有一棵点数为 N 的树,以点 1 为根,且树点有边权.然后有 M 个 操作,分为三种: 操作 1 :把某个节点 ...
- bzoj4034 (树链剖分+线段树)
Problem T2 (bzoj4034 HAOI2015) 题目大意 给定一颗树,1为根节点,要求支持三种操作. 操作 1 :把某个节点 x 的点权增加 a . 操作 2 :把某个节点 x 为根的子 ...
- 【BZOJ-2325】道馆之战 树链剖分 + 线段树
2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec Memory Limit: 256 MBSubmit: 1153 Solved: 421[Submit][Statu ...
- BZOJ2243 (树链剖分+线段树)
Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...
- 【POJ3237】Tree(树链剖分+线段树)
Description You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edg ...
- B20J_3231_[SDOI2014]旅行_树链剖分+线段树
B20J_3231_[SDOI2014]旅行_树链剖分+线段树 题意: S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,城市信仰不同的宗教,为了方便,我们用不同的正整数代表各种宗教. S国 ...
- 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树
正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...
- BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树
题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...
- BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树
题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...
- fzu 2082 过路费 (树链剖分+线段树 边权)
Problem 2082 过路费 Accept: 887 Submit: 2881Time Limit: 1000 mSec Memory Limit : 32768 KB Proble ...
随机推荐
- 788. Rotated Digits 旋转数字
[抄题]: X is a good number if after rotating each digit individually by 180 degrees, we get a valid nu ...
- CentOS集群自动同步时间的一种方法
CentOS集群自动同步时间的一种方法 之前有篇日志是手动同步时间的 http://www.ahlinux.com/os/201304/202456.html 之所以这么干,是因为我们实验室的局域网只 ...
- MYSQL优化——索引覆盖
索引覆盖:如果查询的列恰好是索引的一部分,那么查询只需要在索引文件上进行,不需要进行到磁盘中找数据,若果查询得列不是索引的一部分则要到磁盘中找数据. 建表: create table test_ind ...
- LoadRunner使用问题
最近给客户做POC,为了测试大数据的框架的一个并发能力,使用loadrunner进行相关的测试,目前发现几个要注意的地方 1: loadrunner的Java脚本必须使用jdk1.6的32位版本 2: ...
- 人脸识别 人工智能(AI)
.. 如何通过AI实现 用我自己的数据集:能识别几张人脸.能否判断相似度.能否认出.
- 关于spring”通配符的匹配很全面, 但无法找到元素 'context:component-scan' 的声明“的错误
关于spring配置的问题 近日学习spring时遇到了这个问题: org.springframework.beans.factory.xml.XmlBeanDefinitionStoreExcept ...
- 转Delphi中XLSReadWrite控件的使用(1)---简介
XLSReadWrite控件简介: 一个你需要的,能在Delphi和.NET下访问Excel文件的完美解决方案. 一个经典的读写Excel的控件,对于使用Excel 开发很有帮助 官方网站: http ...
- 转:[python] pip 升级所有的包
pip 当前内建命令并不支持升级所有已安装的Python模块. 列出当前安装的包: pip list 列出可升级的包: pip list --outdate 升级一个包: pip install -- ...
- 替归算法获取Treeview所有节点
treeview.nodes是获取下一级所有子节点,但是如果是多层的话,就不能,想个法子来获取所有的节点(含节点的子节点),想了想 还是替归算法比较方便,如是有了下面的代码 public static ...
- [转]Programmatically Register Assemblies in C#.
1. Introduction. 1.1 After publishing Programmatically Register COM Dlls in C# back in 2011, I recei ...