题目链接

  动态开点的树链剖分qwq。

  跟小奇的花园一模一样,不做过多讲解。

  

#include<cstdio>
#include<cstring>
#include<cctype>
#include<cstdlib>
#include<algorithm>
#define maxn 100010
#define mid ((l+r)>>1)
#define check(x) if(x==0) x=++tot;
using namespace std;
inline long long read(){
long long num=,f=;
char ch=getchar();
while(!isdigit(ch)){
if(ch=='-') f=-;
ch=getchar();
}
while(isdigit(ch)){
num=num*+ch-'';
ch=getchar();
}
return num*f;
} struct Edge{
int next,to;
}edge[maxn*];
int head[maxn],num;
inline void add(int from,int to){
edge[++num]=(Edge){head[from],to};
head[from]=num;
} int dfn[maxn];
int back[maxn],cnt;
int sum[maxn*],tot;
int mav[maxn*];
int root[maxn];
int ls[maxn*];
int rs[maxn*];
int top[maxn];
int size[maxn];
int son[maxn];
int deep[maxn];
int father[maxn];
int d[maxn];
int q[maxn];
int n,m; void find(int x,int fa){
size[x]=;deep[x]=deep[fa]+;
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==fa) continue;
father[to]=x;
find(to,x);
size[x]+=size[to];
if(son[x]==||size[son[x]]<size[to]) son[x]=to;
}
} void unionn(int x,int Top){
dfn[x]=++cnt; back[cnt]=x;
top[x]=Top;
if(son[x]==) return;
unionn(son[x],Top);
for(int i=head[x];i;i=edge[i].next){
int to=edge[i].to;
if(to==father[x]||to==son[x]) continue;
unionn(to,to);
}
} inline void pushup(int rt){
sum[rt]=sum[ls[rt]]+sum[rs[rt]];
mav[rt]=max(mav[ls[rt]],mav[rs[rt]]);
} void update(int o,int num,int l,int r,int &rt){
check(rt);
if(l==r){
sum[rt]=num;
mav[rt]=num;
return;
}
if(o<=mid) update(o,num,l,mid,ls[rt]);
else update(o,num,mid+,r,rs[rt]);
pushup(rt);
return;
} int quemax(int from,int to,int l,int r,int &rt){
if(rt==) return ;
if(from<=l&&to>=r) return mav[rt];
int ans=;
if(from<=mid) ans=max(ans,quemax(from,to,l,mid,ls[rt]));
if(to>mid) ans=max(ans,quemax(from,to,mid+,r,rs[rt]));
return ans;
} int quesum(int from,int to,int l,int r,int &rt){
if(rt==) return ;
if(from<=l&&to>=r) return sum[rt];
int ans=;
if(from<=mid) ans+=quesum(from,to,l,mid,ls[rt]);
if(to>mid) ans+=quesum(from,to,mid+,r,rs[rt]);
return ans;
} int askmax(int from,int to,int val){
int ans=;
while(top[from]!=top[to]){
if(deep[top[from]]<deep[top[to]]) swap(from,to);
ans=max(ans,quemax(dfn[top[from]],dfn[from],,n,root[val]));
from=father[top[from]];
}
if(deep[from]>=deep[to]) swap(from,to);
ans=max(ans,quemax(dfn[from],dfn[to],,n,root[val]));
return ans;
} int asksum(int from,int to,int val){
int ans=;
while(top[from]!=top[to]){
if(deep[top[from]]<deep[top[to]]) swap(from,to);
ans+=quesum(dfn[top[from]],dfn[from],,n,root[val]);
from=father[top[from]];
}
if(deep[from]>=deep[to]) swap(from,to);
ans+=quesum(dfn[from],dfn[to],,n,root[val]);
return ans;
} void chancol(int pos,int val){
update(dfn[pos],,,n,root[q[pos]]);
update(dfn[pos],d[pos],,n,root[val]);
q[pos]=val;
} void channum(int pos,int val){
update(dfn[pos],val,,n,root[q[pos]]);
d[pos]=val;
} int main(){
n=read(),m=read();
for(int i=;i<=n;++i){
d[i]=read();q[i]=read();
}
for(int i=;i<n;++i){
int x=read(),y=read();
add(x,y);
add(y,x);
}
find(,);
unionn(,);
for(int i=;i<=n;++i) update(dfn[i],d[i],,n,root[q[i]]);
for(int i=;i<=m;++i){
char c[];
scanf("%s",c);
if(c[]=='C'){
if(c[]=='C'){
int x=read(),y=read();
chancol(x,y);
}
else{
int x=read(),y=read();
channum(x,y);
}
}
else if(c[]=='Q'){
if(c[]=='S'){
int x=read(),y=read();
printf("%d\n",asksum(x,y,q[x]));
}
else{
int x=read(),y=read();
printf("%d\n",askmax(x,y,q[x]));
}
}
}
return ;
}

https://www.luogu.org/problemnew/show/P3313

【Luogu】P3313旅行(树链剖分)的更多相关文章

  1. [luogu P3384] [模板]树链剖分

    [luogu P3384] [模板]树链剖分 题目描述 如题,已知一棵包含N个结点的树(连通且无环),每个节点上包含一个数值,需要支持以下操作: 操作1: 格式: 1 x y z 表示将树从x到y结点 ...

  2. P3313 [SDOI2014]旅行——树链剖分+线段树(动态开点?)

    P3313 [SDOI2014]旅行 一棵树,其中的点分类,点有权值,在一条链上找到一类点中的最大值或总和: 树链剖分把树变成链: 把每个宗教单开一个线段树,维护区间总和和最大值: 宗教很多,需要动态 ...

  3. 洛谷P3313 [SDOI2014]旅行(树链剖分 动态开节点线段树)

    题意 题目链接 Sol 树链剖分板子 + 动态开节点线段树板子 #include<bits/stdc++.h> #define Pair pair<int, int> #def ...

  4. BZOJ 3531: [Sdoi2014]旅行 [树链剖分]

    3531: [Sdoi2014]旅行 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1685  Solved: 751[Submit][Status] ...

  5. BZOJ3531:[SDOI2014]旅行(树链剖分)

    Description S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足 从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰 ...

  6. BZOJ 3531 [Sdoi2014]旅行 树链剖分+动态开点线段树

    题意 S国有N个城市,编号从1到N.城市间用N-1条双向道路连接,满足从一个城市出发可以到达其它所有城市.每个城市信仰不同的宗教,如飞天面条神教.隐形独角兽教.绝地教都是常见的信仰. 为了方便,我们用 ...

  7. cogs 186. [USACO Oct08] 牧场旅行 树链剖分 LCA

    186. [USACO Oct08] 牧场旅行 ★★☆   输入文件:pwalk.in   输出文件:pwalk.out   逐字节对比时间限制:1 s   内存限制:128 MB n个被自然地编号为 ...

  8. BZOJ 2157 旅行(树链剖分码农题)

    写了5KB,1发AC... 题意:给出一颗树,支持5种操作. 1.修改某条边的权值.2.将u到v的经过的边的权值取负.3.求u到v的经过的边的权值总和.4.求u到v的经过的边的权值最大值.5.求u到v ...

  9. [BZOj4336][BJOI2015]骑士的旅行(树链剖分+线段树)

    树链剖分,对每个叶子用multiset记录前K大士兵,其余节点通过从儿子归并维护前K大士兵.过于模板. #include<set> #include<cstdio> #incl ...

  10. BZOJ 3531 SDOI2014 旅行 树链剖分+线段树动态开点

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=3531 题意概述: 给出一棵N个点的树,树上的每个结点有一个颜色和权值,支持以下四种操作: ...

随机推荐

  1. 洛谷 P3119 [USACO15JAN]草鉴定Grass Cownoisseur

    屠龙宝刀点击就送 Tarjan缩点+拓扑排序 以后缩点后建图看n范围用vector ,或者直接用map+vector 结构体里数据要清空 代码: #include <cstring> #i ...

  2. UVA11478 Halum (差分约束)

    每次操作是独立的,而且顺序并不影响,作用在同一个结点上的d可以叠加,所以令x(u) = sigma(dui). 最后就是要确定所有的x(u). 因为m越大,满足条件的边就越少,二分答案m. 对于一条边 ...

  3. springboot 测试

    本次测试使用的是springboot 中的测试 1.(对service 的测试)下面的测试.将会启动容器进行测试 @RunWith(SpringRunner.class) @SpringBootTes ...

  4. 【转】iOS-生成Bundle包-引入bundle-使用bundle

    在我们使用第三方框架时,常常看到XXX.bundle的文件. 我们找到该文件,显示包内容,大致看到很多资源文件:图片.配置文本.XIB文件……   什么是Bundle文件? 简单理解,就是资源文件包. ...

  5. UML各种图总结

    UML(Unified Modeling Language)是一种统一建模语言,为面向对象开发系统的产品进行说明.可视化.和编制文档的一种标准语言.下面将对UML的九种图+包图的基本概念进行介绍以及各 ...

  6. python之可迭代对象

    1. 可迭代对象是什么? 字面意思分析:可以重复的迭代的实实在在的东西 专业角度: 内部含有'__iter__'方法的对象,就是可迭代对象 2. 可迭代对象都有什么? list,dict(keys() ...

  7. javaweb基础(7)_HttpServletResponse原理详解

    Web服务器收到客户端的http请求,会针对每一次请求,分别创建一个用于代表请求的request对象.和代表响应的response对象.request和response对象即然代表请求和响应,那我们要 ...

  8. const,static,extern,#define

    一.const // 简单定义变量,可以修改变量的值 ; a = ; // const的用法 // 用法一: ; ; // 不允许修改,因为 const 修饰 b/c,指定 b/c 为常量!! // ...

  9. Golang 简单 http 代理转发

    程序基本实现了对http的完整转发,目前暂不支持https windows需要在设置中的网络>代理设置为手动,并开启代理服务器,填写ip和端口 // httpForward package ma ...

  10. october安装过程

    下载代码 composer create-project october/october myoctober 准备好数据库, create database october; 配置环境于安装 php ...