题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836

树剖裸题。然而WA、RE了好久……

原来是跳 top 的那个地方! top 不相等的时候比较的是 top 的深度,不是自己的深度! top 相等之后才比较自己的深度。

dfs 序离开自己时的标号就是 dfn[ cr ] + siz[ cr ] -1 。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#define ll long long
using namespace std;
const int N=1e5+;
int n,q,hd[N],xnt,to[N],nxt[N];
int fa[N],dep[N],dfn[N],tim,siz[N],son[N],top[N];
int tot,ls[N<<],rs[N<<];
ll sm[N<<],laz[N<<];//
char ch[];
int rdn()
{
int ret=;bool fx=;char ch=getchar();
while(ch>''||ch<''){if(ch=='-')fx=;ch=getchar();}
while(ch>=''&&ch<='') ret=(ret<<)+(ret<<)+ch-'',ch=getchar();
return fx?ret:-ret;
}
void add(int x,int y)
{
to[++xnt]=y;nxt[xnt]=hd[x];hd[x]=xnt;
}
void dfs(int cr)
{
dep[cr]=dep[fa[cr]]+; siz[cr]=;
for(int i=hd[cr],v;i;i=nxt[i])
{
v=to[i];
dfs(v);siz[cr]+=siz[v];
siz[v]>siz[son[cr]]?son[cr]=v:;
}
}
void dfsx(int cr)
{
dfn[cr]=++tim;
if(son[cr])top[son[cr]]=top[cr],dfsx(son[cr]);
for(int i=hd[cr],v;i;i=nxt[i])
if((v=to[i])!=son[cr])
top[v]=v,dfsx(v);
}
void build(int l,int r,int cr)
{
if(l==r)return; int mid=l+r>>;
ls[cr]=++tot;build(l,mid,ls[cr]);
rs[cr]=++tot;build(mid+,r,rs[cr]);
}
void pshd(int cr,int l,int mid,int r)
{
if(!laz[cr])return; ll d=laz[cr]; laz[cr]=;
sm[ls[cr]]+=d*(mid-l+);sm[rs[cr]]+=d*(r-mid);
laz[ls[cr]]+=d;laz[rs[cr]]+=d;
}
void pshp(int cr){sm[cr]=sm[ls[cr]]+sm[rs[cr]];}
void mdfy(int l,int r,int cr,int L,int R,int k)
{
if(l>=L&&r<=R){sm[cr]+=(ll)k*(r-l+);laz[cr]+=k;return;}
int mid=l+r>>;pshd(cr,l,mid,r);
if(L<=mid)mdfy(l,mid,ls[cr],L,R,k);
if(mid<R)mdfy(mid+,r,rs[cr],L,R,k);
pshp(cr);
}
void mdfy(int x,int y,int k)
{
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]])swap(x,y);//dep[top]!!!
mdfy(,n,,dfn[top[x]],dfn[x],k);
x=fa[top[x]];
}
if(dep[x]<dep[y])swap(x,y);//
mdfy(,n,,dfn[y],dfn[x],k);
}
ll query(int l,int r,int cr,int L,int R)
{
if(l>=L&&r<=R)return sm[cr];
int mid=l+r>>;pshd(cr,l,mid,r);
if(R<=mid)return query(l,mid,ls[cr],L,R);
if(mid<L)return query(mid+,r,rs[cr],L,R);
return query(l,mid,ls[cr],L,R)+query(mid+,r,rs[cr],L,R);
}
int main()
{
n=rdn();
for(int i=,u,v;i<n;i++)
{
u=rdn()+; v=rdn()+; fa[v]=u; add(u,v);
}
dfs(); top[]=; dfsx(); tot=; build(,n,);
int u,v,d;q=rdn();
while(q--)
{
scanf("%s",ch);
if(ch[]=='A')
{
u=rdn()+; v=rdn()+; d=rdn(); mdfy(u,v,d);
}
else
{
u=rdn()+;
printf("%lld\n",query(,n,,dfn[u],dfn[u]+siz[u]-));//
}
}
return ;
}

bzoj 2836 魔法树——树链剖分的更多相关文章

  1. bzoj 2836 魔法树 —— 树链剖分

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=2836 树链剖分裸题: 写码五分钟,调码两小时,RE不断,狂交二十五遍,终于找到一处小细节—— ...

  2. 线段树&数链剖分

    傻逼线段树,傻逼数剖 线段树 定义: 线段树是一种二叉搜索树,与区间树相似,它将一个区间划分成一些单元区间,每个单元区间对应线段树中的一个叶结点. 使用线段树可以快速的查找某一个节点在若干条线段中出现 ...

  3. bzoj 3252: 攻略 -- 长链剖分+贪心

    3252: 攻略 Time Limit: 10 Sec  Memory Limit: 128 MB Description 题目简述:树版[k取方格数]   众所周知,桂木桂马是攻略之神,开启攻略之神 ...

  4. bzoj 3252 攻略 长链剖分思想+贪心

    攻略 Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 889  Solved: 423[Submit][Status][Discuss] Descrip ...

  5. BZOJ 2836: 魔法树 (树链剖分+线段树)

    板题-记得开longlong #include <cstdio> #include <cctype> #include <cstring> #include < ...

  6. BZOJ 2836 魔法树 链剖裸题~~

    正好练练熟练度..(刷水题谋财害命QAQ) #include<cstdio> #include<iostream> #define ll long long #define R ...

  7. [LOJ3014][JOI 2019 Final]独特的城市——树的直径+长链剖分

    题目链接: [JOI 2019 Final]独特的城市 对于每个点,它的答案最大就是与它距离最远的点的距离. 而如果与它距离为$x$的点有大于等于两个,那么与它距离小于等于$x$的点都不会被计入答案. ...

  8. UOJ#30/Codeforces 487E Tourists 点双连通分量,Tarjan,圆方树,树链剖分,线段树

    原文链接https://www.cnblogs.com/zhouzhendong/p/UOJ30.html 题目传送门 - UOJ#30 题意 uoj写的很简洁.清晰,这里就不抄一遍了. 题解 首先建 ...

  9. BZOJ1758[Wc2010]重建计划——分数规划+长链剖分+线段树+二分答案+树形DP

    题目描述 输入 第一行包含一个正整数N,表示X国的城市个数. 第二行包含两个正整数L和U,表示政策要求的第一期重建方案中修建道路数的上下限 接下来的N-1行描述重建小组的原有方案,每行三个正整数Ai, ...

随机推荐

  1. Nutch学习笔记一 ---环境搭建

    学习环境: ubuntu 概要: Nutch 是一个开源Java 实现的搜索引擎.它提供了我们运行自己的搜索引擎所需的全部工具.包括全文搜索和Web爬虫. 通过nutch,诞生了hadoop.tika ...

  2. 使用纯CSS3实现一个日食动画

    日食现象是月亮挡在了地球和太阳之间,也就是月亮遮挡住了太阳. 所以要构造日食,我们须要2个对象:一个代表月亮,一个代表太阳. <div class="eclipse sun" ...

  3. [Hibernate开发之路](3)基础配置

    一 JDBC链接 通常你希望SessionFactory来为你创建和缓存(pool)JDBC连接. 假设你採用这样的方式, 仅仅须要例如以下例所看到的那样,打开一个Session: Session s ...

  4. C 标准库 - <stdlib.h>

    C 标准库 - <stdlib.h> 简介 stdlib .h 头文件定义了四个变量类型.一些宏和各种通用工具函数. 库变量 下面是头文件 stdlib.h 中定义的变量类型: 序号 变量 ...

  5. 每日一支TED——帕特里夏&#183;瑞安:不要固执于英语

         瑞安讲述了她在科威特教学英语30年最大的 关于语言的一个感受:英语在迅速的在全世界传播,而其它的语言在逐渐的消失.      瑞安想要说的是.拥有一种国际性的语言,大家都能够理解,让全部人的 ...

  6. 使用CCriticalSection类的注意事项

    在类中使用CCriticalSection变量时,必需要将CCriticalSection变量定义为全局变量和静态变量,否则将出现没有定义的错误. 如: // a.h 文件 class A:publi ...

  7. 【转载】C#中的==、Equal、ReferenceEqual

    1. ReferenceEquals, == , Equals Equals , == , ReferenceEquals都可以用于判断两个对象的个体是不是相等. a) ReferenceEquals ...

  8. 杭电 HDU 1279 验证角谷猜想

    验证角谷猜想 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  9. MOS简介

    功率半导体器件机能 MOS管(击穿原因),它采用“超级结”(Super-Junction)结构,故又称超结功率MOSFET.全数字控制是发展趋势,已经在很多功率变换设备中得到应用.既管理了对电网的谐波 ...

  10. Cocos2d-X中提高性能的方法

     1)内存使用效率: 使用大纹理 场景切换时,要尽量使用replaceScene 2)用好缓存: CCTextureCache(纹理缓存) CCSpriteFrameCache(精灵帧缓存) CC ...