洛谷 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;
}
洛谷 3833 SHOI 2012 魔法树的更多相关文章
- 树链剖分【洛谷P3833】 [SHOI2012]魔法树
P3833 [SHOI2012]魔法树 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节 ...
- [SHOI 2012] 魔法树
[题目链接] https://www.lydsy.com/JudgeOnline/problem.php?id=2836 [算法] 树链剖分 时间复杂度 : O(NlogN ^ 2) [代码] #in ...
- 洛谷3833 [SHOI2012]魔法树
SHOI2012 D2T3 题目描述 Harry Potter 新学了一种魔法:可以让改变树上的果子个数.满心欢喜的他找到了一个巨大的果树,来试验他的新法术. 这棵果树共有N个节点,其中节点0是根节点 ...
- 洛谷 P4070 [SDOI2016]生成魔咒 解题报告
P4070 [SDOI2016]生成魔咒 题目描述 魔咒串由许多魔咒字符组成,魔咒字符可以用数字表示.例如可以将魔咒字符 \(1\).\(2\) 拼凑起来形成一个魔咒串 \([1,2]\). 一个魔咒 ...
- 洛谷 题解 P2119【魔法阵】
很好的一道数学推导题 45分做法 \(O(N^4)\) 暴力枚举四个材料 55分做法 从第一个约束条件可得到所有可行答案都是单调递增的,所以可以排序一遍,减少枚举量,可以拿到55分 100分做法 首先 ...
- [洛谷P4070][SDOI2016]生成魔咒
题目大意:有一个字符串,每次在末尾加入一个字符,问当前共有多少个本质不同的字串 题解:$SAM$,就是问插入这个字符后,多了多少个字串,就是当前这个点的$Right$数组大小. 卡点:无 C++ Co ...
- 洛谷 P1083 [ NOIP 2012 ] 借教室 —— 线段树 / 二分差分数组
题目:https://www.luogu.org/problemnew/show/P1083 当初不会线段树的时候做这道题...对差分什么不太熟练,一直没A,放在那儿不管... 现在去看,线段树就直接 ...
- [洛谷P2408]不同子串个数
题目大意:给你一个字符串,求其中本质不同的字串的个数 题解:同[洛谷P4070][SDOI2016]生成魔咒,只要最后再输出就行了 卡点:无 C++ Code: #include <cstdio ...
- [洛谷P2730] 魔板 Magic Squares
洛谷题目链接:魔板 题目背景 在成功地发明了魔方之后,鲁比克先生发明了它的二维版本,称作魔板.这是一张有8个大小相同的格子的魔板: 1 2 3 4 8 7 6 5 题目描述 我们知道魔板的每一个方格都 ...
随机推荐
- AIZU AOJ 2309 Vector Compression 最小树形图(朱—刘算法)
题意简述:给定若干个相同维度的向量,寻找一种排序方法,使得所有向量的表示长度总和最低. 所谓表示长度为(Aj-r*Ai)^2,其中i<j 数据范围:向量总数和维度均小于100 思路:(1)首先 ...
- 34.无废话ExtJs 入门教程十八[树:TreePanel]
转自:https://www.cnblogs.com/iamlilinfeng/archive/2012/06/28/2566350.html 1. <!DOCTYPE html PUBLIC ...
- apache相关补充
apache相关补充 sendfile机制 1)不用sendfile的传统网络传输过程: read(file, tmp_buf, len) write(socket, tmp_buf, len) 2) ...
- vue中子组件向父组件传值
1.子组件$emit()触发,父组件$on()监听 子组件:<template> <div class="hello"> <button v-on:c ...
- Python网咯爬虫 — Scrapy框架应用
Scrapy框架 Scrapy是一个高级的爬虫框架,它不仅包括了爬虫的特征,还可以方便地将爬虫数据保存到CSV.Json等文件中. Scrapy用途广泛,可以用于数据挖掘.监测 ...
- [HAOI2006]均分数据
题解 今天下午刚学了模拟退火 借这个题来总结下模拟退火的要注意的问题吧 1 : \(eps\)不要设的太大 2 : 初温\(T\)在2000左右就差不多可以了 3 : 注意题目要求是要求最大值还是最小 ...
- [Usaco2013 Nov]No Change
Description Farmer John is at the market to purchase supplies for his farm. He has in his pocket K c ...
- DHTML_____window对象的事件
<html> <head> <meta charset="utf-8"> <title>window对象事件</title&g ...
- js执行顺序——学习笔记
我们知道有个全局的 window对象,js的一切皆window上的属性和方法.window上有个window.document属性,记录了整个html的dom树,document是顶层. body 和 ...
- iOS 项目中的常见文件
iOS的笔记-项目中的常见文件 新建一个项目之后,有那么多的文件,下面介绍一下主要的几个. 1.文件名 (1)AppDelegate UIApplication的代理,app收到干扰的时候,进行处 ...