思路:

轻重链剖分+线段树。

 #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. Linux内存管理--基本概念【转】

    转自:http://blog.csdn.net/myarrow/article/details/8624687 1. Linux物理内存三级架构 对于内存管理,Linux采用了与具体体系架构不相关的设 ...

  2. 从Linux内核中获取真随机数【转】

    转自:http://www.cnblogs.com/bigship/archive/2010/04/04/1704228.html 内核随机数产生器 Linux内核实现了一个随机数产生器,从理论上说这 ...

  3. arch linux 安装指南

    (如果不想折腾arch linux,推荐直接使用 manjaro:  https://manjaro.org/ ) 1.安装准备 Arch Linux 能在任何内存空间不小于 512MB 的 x86_ ...

  4. llinux除了软连接本地文件夹同步:mount

    mount --bind /srv/dir1   /srv/dir2dir1:被共享的文件夹dir2:需要同步的文件夹

  5. 『转载』Matlab中fmincon函数获取乘子

    Matlab中fmincon函数获取乘子 一.输出结构 [x,fval,exitflag,output,lambda] = fmincon(......) 二.结构说明 lambda结构 说     ...

  6. 通达OA系统故障解决案例记录

    案例1: 现象:在人员访问量大的时候OA系统经卡死,并且经常宕机,需要启动apache服务 优化配置如下: D:\MYOA\conf\http.conf 修改参数如下: <IfModule mp ...

  7. java多线程快速入门(三)

    通过实现Runnable接口实现多线程 package com.cppdy; //通过实现Runnable接口实现多线程 class MyThread1 implements Runnable{ @O ...

  8. bzoj 2142

    数论大集合 只要你做完了这道题,除了线性筛和降幂公式以外,所有数论noip知识点就都会了... 题意:求C(n,∑w)*C(∑w,w1)*C(∑w-w1,w2).....mod p(不保证p为质数) ...

  9. unittest常用的断言方法

    unittest常用的断言方法 #msg:判断不成立时需要反馈的字符串 assertEqual(self, first, second, msg=None) --判断两个参数相等:first == s ...

  10. python简单笔记

    Remarks:python中注意缩进(Tab键或者4个空格) print(输出) 格式:print(values) 字符串.数字.变量等都可以输出: 实例: print(1)->1 print ...