题目:Aragorn's Story

题意:给一棵树,并给定各个点权的值,然后有3种操作:

I C1 C2 K: 把C1与C2的路径上的所有点权值加上K

D C1 C2 K:把C1与C2的路径上的所有点权值减去K

Q C:查询节点编号为C的权值

分析:典型的树链剖分题目,先进行剖分,然后用线段树去维护即可,注意HDU的OJ采用Windows系统,容易爆栈,所以在代码

前面加上:#pragma comment(linker, "/STACK:1024000000,1024000000")进行手动扩栈。

#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <iostream>
#include <string.h>
#include <algorithm>
#include <stdio.h>
#include <vector>
using namespace std;
const int N=50010;
int n,m,Q;
int tim;
int num[N],siz[N],top[N],son[N];
int dep[N],tid[N],rank[N],fa[N];
int head[N],to[2*N],next[2*N],edge;
void Init()
{
memset(head,-1,sizeof(head));
memset(son,-1,sizeof(son));
tim=0;
edge=0;
}
void addedge(int u,int v)
{
to[edge]=v,next[edge]=head[u],head[u]=edge++;
to[edge]=u,next[edge]=head[v],head[v]=edge++;
}
//树链剖分部分
void dfs1(int u,int father,int d)
{
dep[u]=d;
fa[u]=father;
siz[u]=1;
for(int i=head[u];~i;i=next[i])
{
int v=to[i];
if(v!=father)
{
dfs1(v,u,d+1);
siz[u]+=siz[v];
if(son[u]==-1||siz[v]>siz[son[u]])
son[u]=v;
}
}
}
void dfs2(int u,int tp)
{
top[u]=tp;
tid[u]=++tim;
rank[tid[u]]=u;
if(son[u]==-1) return;
dfs2(son[u],tp);
for(int i=head[u];~i;i=next[i])
{
int v=to[i];
if(v!=son[u]&&v!=fa[u])
dfs2(v,v);
}
}
//线段树部分
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
int sum[4*N],col[4*N];
void PushUP(int rt)
{
sum[rt]=max(sum[rt<<1],sum[rt<<1|1]);
}
void PushDown(int rt,int m)
{
if(col[rt])
{
col[rt<<1]+=col[rt];
col[rt<<1|1]+=col[rt];
sum[rt<<1]+=(m-(m>>1))*col[rt];
sum[rt<<1|1]+=(m>>1)*col[rt];
col[rt]=0;
}
}
void Build(int l,int r,int rt)
{
col[rt]=0;
if(l==r)
{
sum[rt]=num[rank[l]];
return;
}
int mid=(l+r)>>1;
Build(lson);
Build(rson);
PushUP(rt);
}
void Update(int L,int R,int v,int l,int r,int rt)
{
if(L<=l&&R>=r)
{
col[rt]+=v;
sum[rt]+=v*(r-l+1);
return;
}
PushDown(rt,r-l+1);
int mid=(l+r)>>1;
if(L<=mid)
Update(L,R,v,lson);
if(R>mid)
Update(L,R,v,rson);
PushUP(rt);
}
int Query(int l,int r,int rt,int val)
{
if(l==r)
return sum[rt];
PushDown(rt,r-l+1);
int mid=(l+r)>>1;
int ret=0;
if(val<=mid) ret=Query(lson,val);
else         ret=Query(rson,val);
PushUP(rt);
return ret;
}
void Change(int x,int y,int val)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
Update(tid[top[x]],tid[x],val,1,n,1);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
Update(tid[x],tid[y],val,1,n,1);
}
int main()
{
char oper[5];
int a,b,c;
while(~scanf("%d%d%d",&n,&m,&Q))
{
Init();
for(int i=1;i<=n;i++)
scanf("%d",&num[i]);
for(int i=1;i<=m;i++)
{
scanf("%d%d",&a,&b);
addedge(a,b);
}
dfs1(1,0,0);
dfs2(1,1);
Build(1,n,1);
while(Q--)
{
scanf("%s",oper);
if(oper[0]=='Q')
{
scanf("%d",&a);
printf("%d\n",Query(1,n,1,tid[a]));
}
else
{
scanf("%d%d%d",&a,&b,&c);
if(oper[0]=='D') c=-c;
Change(a,b,c);
}
}
}
return 0;
}

HDU3966(树链剖分)相关推荐

  1. hdu3966 树链剖分点权模板+线段树区间更新/树状数组区间更新单点查询

    点权树的模板题,另外发现树状数组也是可以区间更新的.. 注意在对链进行操作时方向不要搞错 线段树版本 #include<bits/stdc++.h> using namespace std ...

  2. [hdu3966 Aragorn's Story]树链剖分

    题意:要求在一棵N(<=50000)个带权节点的树上支持3种操作 (1)I u v w,u到v的路径上每个节点权值增加w (2)D u v w,u到v的路径上每个节点权值减少w (3)Q u,求 ...

  3. SPOJ375(树链剖分)

    题目:Query on a tree 题意:给定一棵树,告诉了每条边的权值,然后给出两种操作: (1)把第i条边的权值改为val (2)询问a,b路径上权值最大的边 分析:本题与HDU3966差不多, ...

  4. SPOJ- QTREE+HDU 3966(树链剖分裸题

    题目:维护一个树,支持修改边长,查询任意两点间距离. 思路:学习了一下树链剖分,还是看了一阵子才看懂的(大概两个多小时orz...)其实总的来说并不是很难,主要是数组比较多,然后看的那篇博客大概是为了 ...

  5. 【ZJOI2008】树的统计(树链剖分)

    传送门 Solution: 就是树链剖分入门题啦~ // luogu-judger-enable-o2 #include<bits/stdc++.h> #define N 30005 #d ...

  6. 树链剖分+线段树 HDOJ 4897 Little Devil I(小恶魔)

    题目链接 题意: 给定一棵树,每条边有黑白两种颜色,初始都是白色,现在有三种操作: 1 u v:u到v路径(最短)上的边都取成相反的颜色 2 u v:u到v路径上相邻的边都取成相反的颜色(相邻即仅有一 ...

  7. P1505 [国家集训队]旅游 树链剖分

    题目链接 题意:树上更新某一点权值,更新两点简单路径权值,查询最大,最小,和 思路:思路应该比较简单,就是树链剖分后用线段树维护区间最大最小以及区间和. 但是本题比较特殊的是给的边权,转化为点权即可. ...

  8. 【模板】树链剖分 P3384

    题目链接 //部分转自:https://www.luogu.org/problemnew/solution/P3384 初学树链剖分,感觉这个模板题还是容易理解的,但是实在是码量很大的. 知识点: 重 ...

  9. 树链剖分——线段树区间合并bzoj染色

    线段树区间合并就挺麻烦了,再套个树链就更加鬼畜,不过除了代码量大就没什么其他的了.. 一些细节:线段树每个结点用结构体保存,pushup等合并函数改成返回一个结构体,这样好写一些 struct Seg ...

最新文章

  1. html创建等边三角形,CSS3 等边三角形组成星形图案
  2. 基于matlab的卷积码实验报告,基于MATLAB的卷积码编译码设计仿真.doc
  3. 用Python评测三种批量查询经纬度的方法,你pick哪一种?
  4. pyecharts第五节、关系图
  5. 无人机自动悬停的实现方法
  6. windwon安装macaca环境
  7. Spring Cloud微服务之子模块的创建(二)
  8. 框架简述 带你认识 Mybatis
  9. RocketMQ入门到入土(七 )为什么同一个消费组设置不同tag会出现奇怪现象
  10. 安装m2eclipse插件
  11. SSM框架开发web项目系列(四) MyBatis之快速掌握动态SQL
  12. 官网下载到离线的Adobe Acrobat Reader DC
  13. C#查找Excel()重复项
  14. package titlesec error: nested titles
  15. 记录一些Mac OS X技巧
  16. 万字长文:2019 年 京东 PLUS 会员前端重构之路
  17. 2021-08-02网关http或tcp收发等极简物联网通用json协议设计
  18. android版本60支持云闪付,云闪付app下载-云闪付 安卓版v8.0.5-PC6安卓网
  19. 【笔记】wlan - 基础概念(无线、wifi、常见协议、频谱、信道、ap部署、案例)
  20. 机器人队sw快速画图注意点

热门文章

  1. HandlerAdapters
  2. MybatisPlus介绍
  3. 使用response的writer
  4. webservice的css哪里添加,jQuery_XML+XSLT+CSS+JQuery+WebService组建Asp.Net网(2), 3.       更 - phpStudy...
  5. pytorch教程龙曲良16-20
  6. python学习教程(链接)
  7. 基于语音识别的微博签到系统
  8. 一个产品经理的自述:我在腾讯工作的这一年(转)
  9. Spring学习总结(9)——Spring AOP总结
  10. WWDC 2013 Session笔记 - iOS7中的多任务