[CodeVS4633][Mz]树链剖分练习
思路:
轻重链剖分+线段树。
#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]树链剖分练习的更多相关文章
- Codevs 4633 [Mz]树链剖分练习
4633 [Mz]树链剖分练习 时间限制: 1 s 空间限制: 64000 KB 题目等级 : 大师 Master 题目描述 Description 给定一棵结点数为n的树,初始点权均为0,有依次q个 ...
- CODE[VS]4633:Mz树链剖分练习
Description 给定一棵结点数为n的树,初始点权均为0,有依次q个操作,每次操作有三个参数a,b,c,当a=1时,表示给b号结点到c号结点路径上的所有点(包括b,c,下同)权值都增加1,当a= ...
- 树链剖分(+线段树)(codevs4633)
type node=^link; link=record des:longint; next:node; end; type seg=record z,y,lc,rc,toadd,sum:longin ...
- 2020牛客NOIP赛前集训营-提高组(第三场) C - 牛半仙的妹子Tree (树链剖分)
昨天教练问我:你用树剖做这道题,怎么全部清空状态呢? 我:???不是懒标记就完了??? 教练:树剖不是要建很多棵线段树吗,不止log个,你要一个一个清? 我:为什么要建很多棵线段树? ...
- BZOJ 3626: [LNOI2014]LCA [树链剖分 离线|主席树]
3626: [LNOI2014]LCA Time Limit: 10 Sec Memory Limit: 128 MBSubmit: 2050 Solved: 817[Submit][Status ...
- BZOJ 1984: 月下“毛景树” [树链剖分 边权]
1984: 月下“毛景树” Time Limit: 20 Sec Memory Limit: 64 MBSubmit: 1728 Solved: 531[Submit][Status][Discu ...
- codevs 1228 苹果树 树链剖分讲解
题目:codevs 1228 苹果树 链接:http://codevs.cn/problem/1228/ 看了这么多树链剖分的解释,几个小时后总算把树链剖分弄懂了. 树链剖分的功能:快速修改,查询树上 ...
- 并查集+树链剖分+线段树 HDOJ 5458 Stability(稳定性)
题目链接 题意: 有n个点m条边的无向图,有环还有重边,a到b的稳定性的定义是有多少条边,单独删去会使a和b不连通.有两种操作: 1. 删去a到b的一条边 2. 询问a到b的稳定性 思路: 首先删边考 ...
- 树链剖分+线段树 CF 593D Happy Tree Party(快乐树聚会)
题目链接 题意: 有n个点的一棵树,两种操作: 1. a到b的路径上,给一个y,对于路径上每一条边,进行操作,问最后的y: 2. 修改某个条边p的值为c 思路: 链上操作的问题,想树链剖分和LCT,对 ...
随机推荐
- ES系列十四、ES聚合分析(聚合分析简介、指标聚合、桶聚合)
一.聚合分析简介 1. ES聚合分析是什么? 聚合分析是数据库中重要的功能特性,完成对一个查询的数据集中数据的聚合计算,如:找出某字段(或计算表达式的结果)的最大值.最小值,计算和.平均值等.ES作为 ...
- openstack新版本ocata的接口改动
新增placement API,部分替代了原先的nova api的部分功能接口 可在此页面查看API详情及示例:https://specs.openstack.org/openstack/nova-s ...
- shiro设置session超时时间
系统默认超时时间是180000毫秒(30分钟) long timeout = SecurityUtils.getSubject().getSession().getTimeout(); System. ...
- C#哈希表(HashTable)和Dictionary比较
添加数据时Hashtable快.频繁调用数据时Dictionary快. Dictionary<K,V>是泛型的,当K或V是值类型时,其速度远远超过Hashtable. using Syst ...
- quartz在application中的使用
项目结构图: TestMain.java package com; import org.quartz.Scheduler; import org.quartz.impl.StdSchedulerFa ...
- 批量监测dns是否可用脚本,不可用时并切换
#!/usr/bin/env python # coding=utf-8 # hexm@2016-02-14 import time import requests import paramiko i ...
- OneNET麒麟座应用开发之十:空气质量数据监测站项目总结
大气质量数据监测站用于测试空气质量监测及数据采集,实现野外或者室内空气质量的检测. 1.项目概述 本项目是一个定制项目,要求采集大气的压力.温度.湿度.PM25.位置等数据并上传到指定的后台服务器.但 ...
- 步步为营-21-xml的增删改查
1 增加(存在则添加,不存在则新建) //对xml的操作-- XmlDocument doc = new XmlDocument(); if (File.Exists("Person.xml ...
- VEMap.DeleteAllShapeLayers 方法
来源:https://msdn.microsoft.com/zh-cn/library/bb412514.aspx <!DOCTYPE html PUBLIC "-//W3C//DTD ...
- HBuilder支持jquery、zepto、angular、ext、dojo 等js框架的提示吗
HBuilder有通行的js扫描分析提示,大部分js库都可以方便的提示.但js是一门超级灵活的语言,通行分析有时分析的不够完美,如果对框架做单独优化配置,可以有更好的提示.DCloud官方对jquer ...