洛谷 3833 SHOI 2012 魔法树
【题解】
树链剖分模板题。。
#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 魔法树相关推荐
- 洛谷 P4070 [SDOI2016]生成魔咒 解题报告
P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...
- 洛谷 P4070 [SDOI2016]生成魔咒 后缀自动机
题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 1.2 拼凑起来形成一个魔咒串 [1,2]. 一个魔咒串 S 的非空字串被称为魔咒串 S 的生成魔咒. 例如 S=[1, ...
- 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树
题目传送门: 洛谷 P1873 [COCI 2011/2012 #5] EKO / 砍树 题目描述 伐木工人 Mirko 需要砍 M 米长的木材.对 Mirko 来说这是很简单的工作,因为他有一个漂亮 ...
- 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树(二分法)
题目链接 : 洛谷P1873 [COCI 2011/2012 #5] EKO / 砍树 文章目录 前言 一.题目 题目描述 输入格式 输出格式 输入输出样例 说明/提示 二.代码 前言 第一次写博客, ...
- java 判断一个数是正整数_【Java】P1075 质因数分解—关于数学方法在解题中的运用—(OJ:洛谷)...
点击上方"蓝字"关注我们了解更多算法思路01题目 题目来源:洛谷OJ 题目链接: https://www.luogu.com.cn/ 题目描述 已知正整数n是两个不同的质数的乘积, ...
- 递归——外星密码(洛谷 P1928)
题目选自洛谷P1928 这道题很明显得用递归来做,我这里给出很清楚的解题思路,供大家参考! 1.初步思路 输入的这个字符串是被多重「压缩」的,所以一重一重地「解压缩」可能会非常非常麻烦(不过应该是可行 ...
- 题解 洛谷 P4042 [AHOI2014/JSOI2014]骑士游戏
洛谷P4042[AHOI2014/JSOI2014]骑士游戏\color{#00F}{洛谷\ P4042\ [AHOI2014/JSOI2014]骑士游戏}洛谷 P4042 [AHOI2014/JSO ...
- 洛谷 P7960 [NOIP2021] 报数
PS:如果读过题了可以跳过题目描述直接到题解部分 提交链接:洛谷 P7960 [NOIP2021] 报数 题目 题目描述 报数游戏是一个广为流传的休闲小游戏.参加游戏的每个人要按一定顺序轮流报数,但如 ...
- 洛谷循环结构(Freshman锻炼牛犇勿喷)
第一题 找最小值 题目描述 给出 n(n\le100)n(n≤100) 和 nn 个整数 a_i(0\le a_i \le 1000)ai(0≤ai≤1000),求这 nn 个整数中最小值是什么. ...
最新文章
- poj1422(最小路径覆盖问题)
- MIME type类型
- 使用PHP创建一个REST API(译)
- html中纯js互斥按钮,JS如何实现checkbox互斥功能
- 趣说游戏AI开发:曼哈顿街角的A*算法
- 2019牛客暑期多校训练营(第六场)E - Androgynos (构建自补图)
- CI/CD大幅减少甩锅!
- 张军:围绕“WebRTC+AI+大数据”创新
- 涂鸦WIFI模组方案(模组 SDK)
- Luogu P1041 [2003NOIP提高组]传染病控制
- js延时函数_JS 函数的执行时机
- python绘制国际象棋规则口诀_学好国际象棋必须知道的小口诀技巧
- Acwing 1402. 星空之夜(搜索+哈希)
- 【原创】驳罗素《我为什么不是基督徒》
- ktv无线服务器,KTV无线网络覆盖方案-无死角WIFI信号全覆盖方法
- 百分点大数据技术团队:互联网舆情系统的架构实践
- ccf化学方程式配平检验
- 微信公众号——网页授权
- 2021 秋招算法岗人间地狱?人工智能方向年薪 60w 起!
- 美国宾州计算机学校,美国留学,看看宾州有哪些顶尖学校?
热门文章
- 1130: 零起点学算法37——求阶乘
- 使用 ODP.NET 访问 Oracle(.net如何访问Oracle)详解
- Matlab计算矩阵和函数梯度
- Oracle Linux 6下安装Oracle 12C实战
- 没有下班时间的上班怎么办?
- Python字符集编码和文件读写
- Vue二次封装axios为插件使用
- 蓝桥杯 ADV-83算法提高 寻找三位数
- 超级计算机的容量单位,微型计算机内存容量的基本单位(计算机内存容量什么单位)...
- oracle+生成+sql语句,Oracle使用SQL语句生成日历的实现方法