思路:

轻重链剖分+线段树。

 #include<cstdio>
#include<vector>
#include<cstring>
const int N=;
std::vector<int> e[N];
inline void add_edge(const int u,const int v) {
e[u].push_back(v);
e[v].push_back(u);
}
int par[N]={,},dep[N]={},size[N]={};
void dfs1(const int x) {
size[x]=;
for(unsigned int i=;i<e[x].size();i++) {
if(e[x][i]==par[x]) continue;
par[e[x][i]]=x,dep[e[x][i]]=dep[x]+;
dfs1(e[x][i]);
size[x]+=size[e[x][i]];
}
}
int top[N]={},dfn[N],sz=;
void dfs2(const int x) {
if(!top[x]) top[x]=x;
dfn[x]=++sz;
if(e[x].size()==&&x!=) return;
int v=;
for(unsigned int i=;i<e[x].size();i++) {
if(e[x][i]==par[x]) continue;
if(size[e[x][i]]>size[v]) v=e[x][i];
}
top[v]=top[x];
dfs2(v);
for(unsigned int i=;i<e[x].size();i++) {
if(e[x][i]==par[x]||e[x][i]==v) continue;
dfs2(e[x][i]);
}
}
class SegmentTree {
#define _left <<1
#define _right <<1|1
private:
int val[N<<],tag[N<<];
int len(const int l,const int r) {
return r-l+;
}
void push_down(const int p,const int b,const int e) {
if(!tag[p]) return;
int mid=(b+e)>>;
tag[p _left]+=tag[p];
tag[p _right]+=tag[p];
val[p _left]+=tag[p]*len(b,mid);
val[p _right]+=tag[p]*len(mid+,e);
tag[p]=;
}
void push_up(const int p) {
val[p]=val[p _left]+val[p _right];
}
public:
SegmentTree() {
memset(val,,sizeof val);
memset(tag,,sizeof tag);
}
void modify(const int p,const int b,const int e,const int l,const int r) {
if((b==l)&&(e==r)) {
val[p]+=len(b,e);
tag[p]++;
return;
}
push_down(p,b,e);
int mid=(b+e)>>;
if(l<=mid) modify(p _left,b,mid,l,std::min(mid,r));
if(r>mid) modify(p _right,mid+,e,std::max(mid+,l),r);
push_up(p);
}
int query(const int p,const int b,const int e,const int l,const int r) {
if((b==l)&&(e==r)) return val[p];
push_down(p,b,e);
int mid=(b+e)>>,ans=;
if(l<=mid) ans+=query(p _left,b,mid,l,std::min(mid,r));
if(r>mid) ans+=query(p _right,mid+,e,std::max(mid+,l),r);
return ans;
}
};
SegmentTree t;
inline void swap(int &x,int &y) {
int t;
t=x;
x=y;
y=t;
}
int n;
void modify(int x,int y) {
for(;top[x]!=top[y];x=par[top[x]]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
t.modify(,,n,dfn[top[x]],dfn[x]);
}
if(dep[x]<dep[y]) swap(x,y);
t.modify(,,n,dfn[y],dfn[x]);
}
int query(int x,int y) {
int ans=;
for(;top[x]!=top[y];x=par[top[x]]) {
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=t.query(,,n,dfn[top[x]],dfn[x]);
}
if(dep[x]<dep[y]) swap(x,y);
ans+=t.query(,,n,dfn[y],dfn[x]);
return ans;
}
int main() {
scanf("%d",&n);
for(int i=;i<n;i++) {
int x,y;
scanf("%d%d",&x,&y);
add_edge(x,y);
}
dfs1();
dfs2();
int q;
scanf("%d",&q);
while(q--) {
int op,x,y;
scanf("%d%d%d",&op,&x,&y);
if(op==) modify(x,y);
if(op==) printf("%d\n",query(x,y));
}
return ;
}

[CodeVS4633][Mz]树链剖分练习的更多相关文章

  1. Codevs 4633 [Mz]树链剖分练习

    4633 [Mz]树链剖分练习 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description 给定一棵结点数为n的树,初始点权均为0,有依次q个 ...

  2. CODE[VS]4633:Mz树链剖分练习

    Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a= ...

  3. 树链剖分(+线段树)(codevs4633)

    type node=^link; link=record des:longint; next:node; end; type seg=record z,y,lc,rc,toadd,sum:longin ...

  4. 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)

    昨天教练问我:你用树剖做这道题,怎么全部清空状态呢?    我:???不是懒标记就完了???    教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清?    我:为什么要建很多棵线段树? ...

  5. BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]

    3626: [LNOI2014]LCA Time Limit: 10 Sec  Memory Limit: 128 MBSubmit: 2050  Solved: 817[Submit][Status ...

  6. BZOJ 1984: 月下“毛景树” [树链剖分 边权]

    1984: 月下“毛景树” Time Limit: 20 Sec  Memory Limit: 64 MBSubmit: 1728  Solved: 531[Submit][Status][Discu ...

  7. codevs 1228 苹果树 树链剖分讲解

    题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...

  8. 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)

    题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...

  9. 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)

    题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...

随机推荐

  1. kafka系列二、kafka manager的安装和使用

    1. Yahoo kafka manager介绍 项目地址:https://github.com/yahoo/kafka-manager Requirements: Kafka 0.8.1.1 or ...

  2. HTML学习笔记04-样式

    HTML<style>属性 style属性的作用: 提供了一种改变所有HTML元素样式的通用方法 background-colco属性为元素定义了背景颜色: <!DOCTYPE HT ...

  3. zabbix3.0.4关于java服务端程序内存溢出的处理

    关于java服务端程序内存溢出的处理 java服务端程序内存溢出会产生jvm.log文件,此时程序会挂掉,无法正常处理业务,需要重启服务 思路: 当存在jvm.log这个文件的时候则触发clean_j ...

  4. jquery引入

    网络地址:http://code.jquery.com/jquery-2.2.0.min.js 在需要的页面中直接使用网络地址,就不需要本地文件 <script type="text/ ...

  5. WampServer配置

    本机php环境搭建教程:windows环境下wampserver的配置教程--超级详细 对于初做PHP网站的朋友来说,第一步肯定是希望在自己电脑是搭建PHP环境,省去空间和上传的麻烦!但搭建环境也不是 ...

  6. Android手势滑动Tab

    Android手势滑动Tab //MainActivity.java public class MainActivity extends TabActivity { ; ; ; private Ges ...

  7. npm下载速度过慢的解决办法

    第一种方式: 在cmd 输入指令:npm config set registry https://registry.npm.taobao.org 不建议使用cnpm! 设置完后,注意检查:输入指令:n ...

  8. Java 导入数据到Excel并提供文件下载接口

    作者:Howie_Y链接:https://juejin.im/post/5ab4799451882521d6577fe4 最近的项目中遇到了一个将数据库的信息导入到一个 Excel 文件的需求,而且还 ...

  9. Windows环境selenium+Python环境配置

    1.安装Python 访问Python官方网站. 根据自己的操作系统32/64 位,选择相应的版本. 安装过程我就不详细描述了,动动手指头,Google一下,你就知道.我的安装目录为:C:\Pytho ...

  10. C++ code:浮点数的比较(Floating-Pointing Number Comparison)

    浮点数可以进行比较,但是浮点数由于表示精度在不同浮点数类型中的差异,所以会被误用.例如: #include <iostream> using namespace std; int main ...