【题解】

  树链剖分模板题。。

#include<cstdio>
#include<algorithm>
#include<queue>
#define N 500010
#define rg register
#define ls (u<<1)
#define rs (u<<1|1)
#define mid ((a[u].l+a[u].r)>>1)
#define len(x) (a[x].r-a[x].l+1)
using namespace std;
int n,m,rt,num,x,y,z,fa[N],dfn[N],dep[N],size[N],heavy[N],top[N];
vector<int>son[N];
struct tree{int l,r;long long sum,del;
}a[N];
inline int read(){int k=0,f=1; char c=getchar();while(c<'0'||c>'9')c=='-'&&(f=-1),c=getchar();while('0'<=c&&c<='9')k=k*10+c-'0',c=getchar();return k*f;
}
inline void pushup(int u){a[u].sum=a[ls].sum+a[rs].sum;
}
inline void pushdown(int u){if(!a[u].del) return; long long d=a[u].del; a[u].del=0;a[ls].del+=d; a[ls].sum+=d*len(ls);a[rs].del+=d; a[rs].sum+=d*len(rs);
}
void build(int u,int l,int r){a[u].l=l; a[u].r=r; a[u].sum=a[u].del=0;if(l<r) build(ls,l,mid),build(rs,mid+1,r);
}
void update(int u,int l,int r,long long d){if(l<=a[u].l&&a[u].r<=r){a[u].del+=d; a[u].sum+=d*len(u); return;}pushdown(u);if(l<=mid) update(ls,l,r,d);if(r>mid) update(rs,l,r,d);pushup(u);
}
long long query(int u,int l,int r){if(l<=a[u].l&&a[u].r<=r) return a[u].sum;pushdown(u); long long ret=0;if(l<=mid) ret+=query(ls,l,r);if(r>mid) ret+=query(rs,l,r);return ret;
}
void dfs1(int x){size[x]=1; dep[x]=dep[fa[x]]+1;for(rg int i=0;i<son[x].size();i++){dfs1(son[x][i]);size[x]+=size[son[x][i]];if(size[son[x][i]]>size[heavy[x]]) heavy[x]=son[x][i];}
}
void dfs2(int x,int tp){top[x]=tp; dfn[x]=++num;if(heavy[x]) dfs2(heavy[x],tp);for(rg int i=0;i<son[x].size();i++)if(son[x][i]!=heavy[x]) dfs2(son[x][i],son[x][i]);
}
int main(){n=read(); for(rg int i=1;i<n;i++){int x=read(),y=read();fa[y]=x; son[x].push_back(y);if(x==0) rt=x;}dfs1(rt); dfs2(rt,rt);
//  for(rg int i=0;i<=n;i++) printf("%d ",size[i]); puts("");
//  for(rg int i=0;i<=n;i++) printf("%d ",dfn[i]); puts("");build(1,1,n);m=read();while(m--){char c=getchar();while(c!='A'&&c!='Q')c=getchar();if(c=='A'){x=read(),y=read(),z=read();while(top[x]!=top[y]){if(dep[top[x]]<dep[top[y]]) swap(x,y);update(1,dfn[top[x]],dfn[x],z);x=fa[top[x]];}if(dep[x]>dep[y]) swap(x,y);update(1,dfn[x],dfn[y],z);}else x=read(),printf("%lld\n",query(1,dfn[x],dfn[x]+size[x]-1));}return 0;
}

  

转载于:https://www.cnblogs.com/DriverLao/p/8612034.html

洛谷 3833 SHOI 2012 魔法树相关推荐

  1. 洛谷 P4070 [SDOI2016]生成魔咒 解题报告

    P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...

  2. 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机

    题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...

  3. 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树

    题目传送门: 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮 ...

  4. 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树(二分法)

    题目链接 : 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 文章目录 前言 一.题目 题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.代码 前言 第一次写博客, ...

  5. java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...

    点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...

  6. 递归——外星密码(洛谷 P1928)

    题目选自洛谷P1928 这道题很明显得用递归来做,我这里给出很清楚的解题思路,供大家参考! 1.初步思路 输入的这个字符串是被多重「压缩」的,所以一重一重地「解压缩」可能会非常非常麻烦(不过应该是可行 ...

  7. 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏

    洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...

  8. 洛谷 P7960 [NOIP2021] 报数

    PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P7960 [NOIP2021] 报数 题目 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流报数,但如 ...

  9. 洛谷循环结构(Freshman锻炼牛犇勿喷)

    第一题 找最小值 题目描述 给出 n(n\le100)n(n≤100) 和 nn 个整数 a_i(0\le a_i \le 1000)ai​(0≤ai​≤1000),求这 nn 个整数中最小值是什么. ...

最新文章

  1. poj1422(最小路径覆盖问题)
  2. MIME type类型
  3. 使用PHP创建一个REST API(译)
  4. html中纯js互斥按钮,JS如何实现checkbox互斥功能
  5. 趣说游戏AI开发:曼哈顿街角的A*算法
  6. 2019牛客暑期多校训练营(第六场)E - Androgynos (构建自补图)
  7. CI/CD大幅减少甩锅!
  8. 张军:围绕“WebRTC+AI+大数据”创新
  9. 涂鸦WIFI模组方案(模组 SDK)
  10. Luogu P1041 [2003NOIP提高组]传染病控制
  11. js延时函数_JS 函数的执行时机
  12. python绘制国际象棋规则口诀_学好国际象棋必须知道的小口诀技巧
  13. Acwing 1402. 星空之夜(搜索+哈希)
  14. 【原创】驳罗素《我为什么不是基督徒》
  15. ktv无线服务器,KTV无线网络覆盖方案-无死角WIFI信号全覆盖方法
  16. 百分点大数据技术团队:互联网舆情系统的架构实践
  17. ccf化学方程式配平检验
  18. 微信公众号——网页授权
  19. 2021 秋招算法岗人间地狱?人工智能方向年薪 60w 起!
  20. 美国宾州计算机学校,美国留学,看看宾州有哪些顶尖学校?

热门文章

  1. 1130: 零起点学算法37——求阶乘
  2. 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
  3. Matlab计算矩阵和函数梯度
  4. Oracle Linux 6下安装Oracle 12C实战
  5. 没有下班时间的上班怎么办?
  6. Python字符集编码和文件读写
  7. Vue二次封装axios为插件使用
  8. 蓝桥杯 ADV-83算法提高 寻找三位数
  9. 超级计算机的容量单位,微型计算机内存容量的基本单位(计算机内存容量什么单位)...
  10. oracle+生成+sql语句,Oracle使用SQL语句生成日历的实现方法