题目:HDU3966

题意:一棵树上每个节点有一些值,三个操作(其实是俩)
操作I是增加一条链所有点的值
操作D是减少一条链所有点的值
操作Q是查询某个点的值
网上说得手工扩栈,我没扩栈也A掉了

//#pragma comment(linker, "/STACK:1024000000,1024000000")
#include <cstdio>
#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
#define REP(I,N) for (I=0;I<N;I++)
#define rREP(I,N) for (I=N-1;I>=0;I--)
#define rep(I,S,N) for (I=S;I<N;I++)
#define rrep(I,S,N) for (I=N-1;I>=S;I--)
#define FOR(I,S,N) for (I=S;I<=N;I++)
typedef unsigned long long ULL;
typedef long long LL;
const int INF=0x3f3f3f3f;
const LL INFF=0x3f3f3f3f3f3f3f3fll;
const LL M=1e9+7;
const LL maxn=50007;
const double eps=0.00000001;
LL gcd(LL a,LL b){return b?gcd(b,a%b):a;}
template<typename T>inline T abs(T a,T b) {return a>0?a:-a;}int lazy[maxn*4],a[maxn];//用lazy就好吧。。这个不会pushup
void pushdown(int x){if (lazy[x]){lazy[x<<1]+=lazy[x];lazy[x<<1|1]+=lazy[x];lazy[x]=0;}
}
void build(int x,int l,int r){lazy[x]=0;if (l==r) {lazy[x]=a[l];return;}int mid=(l+r)/2;build(x<<1,l,mid);build(x<<1|1,mid+1,r);
}
void update(int x,int l,int r,int val,int L,int R){if (l<=L&&R<=r){lazy[x]+=val;return;}pushdown(x);int mid=(L+R)/2;if (mid>=l) update(x<<1,l,r,val,L,mid);if (r>mid) update(x<<1|1,l,r,val,mid+1,R);
}
int query(int x,int pos,int L,int R){if (L==R) return lazy[x];pushdown(x);int mid=(L+R)/2;if (mid>=pos) return query(x<<1,pos,L,mid);return query(x<<1|1,pos,mid+1,R);
}int n,q,s,T;
int i,j,k;
int u,v,len;
vector<int> edge[maxn];
int fa[maxn],son[maxn],sz[maxn],top[maxn],id[maxn],dep[maxn];
int b[maxn];
int tot;
void dfs1(int u,int from,int depth){int v,i,mx=-1;sz[u]=1;fa[u]=from;dep[u]=depth;son[u]=0;REP(i,edge[u].size()){v=edge[u][i];if (v==from) continue;dfs1(v,u,depth+1);sz[u]+=sz[v];if (sz[v]>mx) mx=sz[v],son[u]=v;}
}
void dfs2(int u,int x){int v,i;top[u]=x;id[u]=++tot;if (son[u]) dfs2(son[u],x);REP(i,edge[u].size()){v=edge[u][i];if (v==fa[u]||v==son[u]) continue;dfs2(v,v);}
}
void Change(int x,int y,int val){while (top[x]!=top[y]){if (dep[top[x]]<dep[top[y]]) swap(x,y);update(1,id[top[x]],id[x],val,1,tot);x=fa[top[x]];}if (dep[x]>dep[y]) swap(x,y);update(1,id[x],id[y],val,1,tot);
}int main(){while (~scanf("%d%d%d",&n,&i,&q)){FOR(i,1,n) scanf("%d",&b[i]);FOR(i,1,n) edge[i].clear();REP(i,n-1){scanf("%d%d",&u,&v);edge[u].push_back(v);edge[v].push_back(u);}tot=0;dfs1(1,0,1);dfs2(1,1);FOR(i,1,n) a[id[i]]=b[i];//映射一下build(1,1,tot);REP(i,q){char c;int c1,c2,k;c=' ';while (c!='I'&&c!='D'&&c!='Q') c=getchar();if (c=='I'){scanf("%d%d%d",&c1,&c2,&k);Change(c1,c2,k);}if (c=='D'){scanf("%d%d%d",&c1,&c2,&k);Change(c1,c2,-k);}if (c=='Q'){scanf("%d",&c1);printf("%d\n",query(1,id[c1],1,tot));}}}
}
/*
*/

HDU3966 树链剖分相关推荐

  1. HDU3966(树链剖分)

    题目:Aragorn's Story 题意:给一棵树,并给定各个点权的值,然后有3种操作: I C1 C2 K: 把C1与C2的路径上的所有点权值加上K D C1 C2 K:把C1与C2的路径上的所有 ...

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

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

  3. [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,求 ...

  4. SPOJ375(树链剖分)

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

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

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

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

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

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

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

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

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

  9. 【模板】树链剖分 P3384

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

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

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

最新文章

  1. iOS发布证书找不到了 回来整理一下
  2. Visual C++ 2012编译器更新(预览版)发布
  3. 【Spring框架家族】SpringBoot整合第三方
  4. 东莞新能源——业务流程管理实践
  5. 使用 Jwt-Auth 实现 API 用户认证以及无痛刷新访问令牌
  6. ReactiveLodeBalancerClientFilter响应式负载均衡代理
  7. pycharm里创建django项目竟然没有django选项
  8. jstring转换到C语言所用的char
  9. 使用MicroPython开发ESP32(06):WebServer功能实现简单说明
  10. Flash Timer的用法 计时器
  11. 组件、控件和插件的区别
  12. 百度地图api-基本用法总结
  13. 如何实现类似淘宝商城的七天自动确认收货???
  14. 嵌入式OTA升级实现原理
  15. ETABS和SAP2000中质量源的定义
  16. 计算机分辨率无法调整,教你电脑分辨率调不过来怎么办
  17. 少儿编程的感想与实践
  18. 将工件模型(stp,stl等)转为均匀稠密点云(pcd,ply)
  19. Mac电脑常用快捷键,官方推荐
  20. 品优购项目案例(练习)

热门文章

  1. amoeba mysql_Amoeba介绍及Amoeba和mysql proxy有区别
  2. 5款在线制图工具分享,快来看看!
  3. 为何中华武术不堪一击?武学大师临终前解密搏击格斗的残酷真相
  4. 不用安装Wincap程序实现ARP广播包的发送和接收
  5. 站在巨人的肩膀上--邵泓鑫
  6. 电子邮箱邮件安全使用技巧,公司电子邮件安全使用总结
  7. 上传图片显示服务器返回错误什么意思,上传图片出错时的解决步骤
  8. 系统的设计一个指标体系
  9. java 使用类的方式描述计算机_用JAVA设计,实现并测试一个计算机类,它包括如下内容...
  10. win8页面 html,Win8 Metro风格界面设计HTML+CSS网页模板