题目连接:http://acm.hdu.edu.cn/showproblem.php?pid=3966

题意:给你一棵树,然后给定点之间的路径权值修改,最后单点查询

题解:树链剖分裸题,这里我用树状数组维护

 #include<cstdio>
#pragma comment(linker, "/STACK:1024000000,1024000000")
#define F(i,a,b) for(int i=a;i<=b;++i) const int N=;char op[];
int n,m,p,tp,x,y,k,a[N],tree[N],nxt[*N],g[N],v[*N],ed,hs[N],fa[N],top[N],dep[N],siz[N],idx,tid[N]; inline void adg(int x,int y){v[++ed]=y,nxt[ed]=g[x],g[x]=ed;}
//树状树组部分
inline void update(int x,int k){while(x<=n)tree[x]+=k,x+=x&-x;}
inline int sum(int x){int ans=;for(;x>;x-=x&-x)ans+=tree[x];return ans;}
//树链部分
void dfs1(int u,int pre){
fa[u]=pre,siz[u]=,dep[u]=dep[pre]+,hs[u]=;
for(int i=g[u];~i;i=nxt[i]){
int vv=v[i];
if(vv!=pre){
dfs1(vv,u);
if(siz[vv]>siz[hs[u]])hs[u]=vv;
siz[u]+=siz[vv];
}
}
} void dfs2(int u,int tp){
tid[u]=++idx,top[u]=tp;
if(hs[u])dfs2(hs[u],tp);
for(int i=g[u];~i;i=nxt[i]){
int vv=v[i];
if(vv!=fa[u]&&vv!=hs[u])dfs2(vv,vv);
}
} void up(int x,int y,int k){
int fx=top[x],fy=top[y];
while(fx!=fy){
if(dep[fx]>=dep[fy])update(tid[fx],k),update(tid[x]+,-k),x=fa[fx],fx=top[x];
else update(tid[fy],k),update(tid[y]+,-k),y=fa[fy],fy=top[y];
}
if(dep[x]>dep[y])x=x^y,y=x^y,x=x^y;
update(tid[x],k),update(tid[y]+,-k);
} int main(){
while(~scanf("%d%d%d",&n,&m,&p)){
F(i,,n)scanf("%d",a+i);
F(i,,N-)g[i]=-,tree[i]=;ed=;
F(i,,m)scanf("%d%d",&x,&y),adg(x,y),adg(y,x);
dfs1(,),idx=,dfs2(,);
F(i,,p){
scanf("%s",op);
if(op[]=='I')scanf("%d%d%d",&x,&y,&k),up(x,y,k);
else if(op[]=='D')scanf("%d%d%d",&x,&y,&k),up(x,y,-k);
else scanf("%d",&k),printf("%d\n",sum(tid[k])+a[k]);
}
}
return ;
}

hdu_3966_Aragorn's Story(树链剖分裸题)的更多相关文章

  1. HDU 5029 Relief grain --树链剖分第一题

    题意:给一棵树,每次给两个节点间的所有节点发放第k种东西,问最后每个节点拿到的最多的东西是哪种. 解法:解决树的路径上的修改查询问题一般用到的是树链剖分+线段树,以前不会写,后来学了一下树链剖分,感觉 ...

  2. BZOJ 2243 染色 | 树链剖分模板题进阶版

    BZOJ 2243 染色 | 树链剖分模板题进阶版 这道题呢~就是个带区间修改的树链剖分~ 如何区间修改?跟树链剖分的区间询问一个道理,再加上线段树的区间修改就好了. 这道题要注意的是,无论是线段树上 ...

  3. 洛谷 P3384 树链剖分(模板题)

    题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点最短路径上所有节点的值都加上z 操作2: 格式 ...

  4. SPOJ Query on a tree 树链剖分 水题

    You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...

  5. bzoj1036 [ZJOI2008]树的统计Count 树链剖分模板题

    [ZJOI2008]树的统计Count Description 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将以下面的形式来要求你对这棵树完成 一些操作: I. CHANGE u ...

  6. BZOJ 2243 染色(树链剖分好题)

    2243: [SDOI2011]染色 Time Limit: 20 Sec  Memory Limit: 512 MB Submit: 7971  Solved: 2990 [Submit][Stat ...

  7. BZOJ 1036 树的统计Count 树链剖分模板题

    题目链接: https://www.lydsy.com/JudgeOnline/problem.php?id=1036 题目大意: 一棵树上有n个节点,编号分别为1到n,每个节点都有一个权值w.我们将 ...

  8. 洛谷 P2146 [NOI2015]软件包管理器 (树链剖分模板题)

    题目描述 Linux用户和OSX用户一定对软件包管理器不会陌生.通过软件包管理器,你可以通过一行命令安装某一个软件包,然后软件包管理器会帮助你从软件源下载软件包,同时自动解决所有的依赖(即下载安装这个 ...

  9. spoj - Grass Planting(树链剖分模板题)

    Grass Planting 题意 给出一棵树,树有边权.每次给出节点 (u, v) ,有两种操作:1. 把 u 到 v 路径上所有边的权值加 1.2. 查询 u 到 v 的权值之和. 分析 如果这些 ...

随机推荐

  1. box-size

    <style> *{ margin:0; padding:0; list-style:none; font-family:"\5FAE\8F6F\96C5\9ED1"; ...

  2. centos7下安装JDK 1.7

    选则64位的rpm包下载:jdk-7u25-linux-x64.rpmrpm –ivh 'jdk安装包路径' 环境变量配置 # exportJAVA_HOME=<jdk-install-dir& ...

  3. 在Eclipse中设置文件的默认打开方式

    在Eclipse中,我们可以设置jsp.xml.js.sql等文件默认打开方式: ①.打开配置选项 ②.找到文件设置 ③.选中我们要设置的文件,默认即可:

  4. msyql sql语句

    参考: http://www.cnblogs.com/aspnethot/articles/1397130.html 修改表字段ALTER TABLE table_name CHANGE old_fi ...

  5. Centos6.3手动rpm安装gcc,c++

    如果你的服务器是不能上网的,那就说明你要手动安装很多软件,比如gcc; 1,首先到http://vault.centos.org/6.3/os/x86_64/Packages/下载用到的rpm包,包括 ...

  6. 第四章 android 命名规范和编码规范

    书里面讲的比较常见,单个人也是有不同的观点: 因为android绝大部分使用java开发的,因此java相关规范适用于android: Google Style: 英文地址:http://google ...

  7. github上一些觉得对自己工作有用的项目收集

    usefullProjectCollect github上一些觉得对自己工作有用的项目收集 技能类 markdown语法中文说明 全文检索 elasticsearch bigdesk elastics ...

  8. 第九十六节,JavaScript概述

    JavaScript概述 学习要点: 1.什么是JavaScript 2.JavaScript特点 3.JavaScript历史 4.JavaScript核心 5.开发工具集 JavaScript诞生 ...

  9. 大数据时代之hadoop(二):hadoop脚本解析

    “兵马未动,粮草先行”,要想深入的了解hadoop,我觉得启动或停止hadoop的脚本是必须要先了解的.说到底,hadoop就是一个分布式存储和计算框架,但是这个分布式环境是如何启动,管理的呢,我就带 ...

  10. js--数组去重3种方法

    js数组去重的三种常用方法总结 第一种是比较常规的方法 思路: 1.构建一个新的数组存放结果 2.for循环中每次从原数组中取出一个元素,用这个元素循环与结果数组对比 3.若结果数组中没有该元素,则存 ...