思路

树剖一发,注意对LCA的处理

代码

#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
const int MAXN = 100100;
int dfs_clock,dep[MAXN*2],heason[MAXN*2],id[MAXN*2],sz[MAXN*2],top[MAXN*2],fa[MAXN*2],w_p[MAXN*2],v[MAXN*2],fir[MAXN*2],nxt[MAXN*2],w[MAXN*2],val[MAXN*2],maxx[MAXN*5],cnt;
struct Edge{
int u,v,w;
}E[MAXN*2]; void addedge(int ui,int vi,int wi){
++cnt;
v[cnt]=vi;
w[cnt]=wi;
nxt[cnt]=fir[ui];
fir[ui]=cnt;
}
void dfs1(int u,int f,int wx){
fa[u]=f;
sz[u]=1;
w_p[u]=wx;
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f)
continue;
dep[v[i]]=dep[u]+1;
dfs1(v[i],u,w[i]);
sz[u]+=sz[v[i]];
if(heason[u]==0||sz[v[i]]>sz[heason[u]])
heason[u]=v[i];
}
}
void dfs2(int u,int f,int topf){
id[u]=++dfs_clock;
val[id[u]]=w_p[u];
top[u]=topf;
if(!heason[u])
return;
dfs2(heason[u],u,topf);
for(int i=fir[u];i;i=nxt[i]){
if(v[i]==f||v[i]==heason[u])
continue;
dfs2(v[i],u,v[i]);
}
}
void pushup(int o){
maxx[o]=max(maxx[o<<1],maxx[o<<1|1]);
}
void build(int l,int r,int o){
if(l==r){
maxx[o]=val[l];
return;
}
int mid=(l+r)>>1;
build(l,mid,o<<1);
build(mid+1,r,o<<1|1);
pushup(o);
}
void update(int l,int r,int pos,int o,int c){
if(l==r){
maxx[o]=c;
return;
}
int mid=(l+r)>>1;
if(pos<=mid)
update(l,mid,pos,o<<1,c);
else
update(mid+1,r,pos,o<<1|1,c);
pushup(o);
}
void update(int o,int c){
update(1,dfs_clock,id[o],1,c);
}
int query(int L,int R,int l,int r,int o){
if(L<=l&&r<=R)
return maxx[o];
int mid=(l+r)>>1,ans=0;
if(L<=mid)
ans=max(ans,query(L,R,l,mid,o<<1));
if(R>mid)
ans=max(ans,query(L,R,mid+1,r,o<<1|1));
return ans;
}
int query(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
ans=max(ans,query(id[top[x]],id[x],1,dfs_clock,1));
x=fa[top[x]];
}
if(dep[x]>dep[y])
swap(x,y);
ans=max(ans,query(id[x],id[y],1,dfs_clock,1));
return ans;
}
int lca(int x,int y){
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])
swap(x,y);
x=fa[top[x]];
}
return (dep[x]<dep[y])?x:y;
}
int n;
int main(){
scanf("%d",&n);
for(int i=1;i<n;i++){
scanf("%d %d %d",&E[i].u,&E[i].v,&E[i].w);
addedge(E[i].u,E[i].v,E[i].w);
addedge(E[i].v,E[i].u,E[i].w);
}
dfs1(1,0,0);
dfs2(1,0,1);
build(1,dfs_clock,1);
char opt[10];
while(1){
scanf("%s",&opt);
if(opt[0]=='D')
break;
if(opt[0]=='Q'){
int a,b;
scanf("%d %d",&a,&b);
int LCA=lca(a,b);
// printf("lca=%d\n",LCA);
int t=w_p[LCA];
update(LCA,0);
int ans=query(a,b);
update(LCA,t);
printf("%d\n",ans);
}
else{
int a,b;
scanf("%d %d",&a,&b);
int t=(dep[E[a].u]>dep[E[a].v])?E[a].u:E[a].v;
w_p[t]=b;
update(t,b);
}
}
return 0;
}

P4114 Qtree1的更多相关文章

  1. 洛谷 P4114 Qtree1 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式: 输出格式: 输入输出样例 输入样例: 输出样例: 说明 说明 思路 Change Query AC代码 总结 题面 题目链接 P4114 Qt ...

  2. 【luogu P4114 Qtree1】 题解

    题目链接:https://www.luogu.org/problemnew/show/P4114 1.把边权转化到点权:选取连接这条边的两个点中较深的一个. 2.查询点到点之间的边权时,要从seg[x ...

  3. 洛谷 - P4114 - Qtree1 - 重链剖分

    https://www.luogu.org/problem/P4114 维护边权的话,用深度大的点表示这条边(可以遍历一边边询问两端深度,这样不需要修改dfs1,也可以在dfs1的时候向下走的同时把边 ...

  4. 洛谷 P4114 Qtree1

    Qtree系列都跟树有着莫大的联系,这道题当然也不例外 我是题面 读完题,我们大概就知道了,这道题非常简单,可以说是模板题.树剖+线段树轻松解决 直接看代码吧 #include<algorith ...

  5. 洛谷P4114 Qtree1

    题目描述 给定一棵\(n\)个节点的树,有两个操作: \(CHANGE\) \(i\) \(t_i\) 把第\(i\)条边的边权变成\(t_i\) \(QUERY\) \(a\) \(b\) 输出从\ ...

  6. 洛谷P4114 Qtree1(树链剖分+线段树)

    传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 //minamoto #include& ...

  7. 树链剖分【洛谷P4114】 Qtree1

    P4114 Qtree1 题目描述 给定一棵n个节点的树,有两个操作: CHANGE i ti 把第i条边的边权变成ti QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0 码 ...

  8. 洛谷 P1505 [国家集训队]旅游 树链剖分

    目录 题面 题目链接 题目描述 输入输出格式 输入格式 输出格式 输入输出样例 输入样例: 输出样例: 说明 思路 AC代码 总结 题面 题目链接 P1505 [国家集训队]旅游 题目描述 Ray 乐 ...

  9. 树链剖分好(du)题(liu)选做

    1.luogu P4315 月下"毛景树" 题目链接 前言: 这大概是本蒟蒻A掉的题里面码量最大的一道题了.我自认为码风比较紧凑,但还是写了175行. 从下午2点多调到晚上8点.中 ...

随机推荐

  1. Windows bat批处理使用

    mkdir commonmkdir datamkdir savemkdir data\tsushima_m_mapmkdir save\tsushima_m_map msxsl ..\common\r ...

  2. Spring Boo数据访问JDBC

    一.SpringBoot 访问JDBC原理 我们可以参考源代码:SpringBoot2中默认的数据源是使用HikariDataSource /** * Hikari DataSource config ...

  3. JavaScript实现预览本地上传图片

    <html> <head> <title> www.jb51.net图片上传预览 </title> <script> function Pr ...

  4. Kali Hydra SSL issue, xHydra (GUI version of Hydra) works just fine

    First find the source code. (https://is.gd/LlS5Sy) - Example search Once located you must download i ...

  5. python类与对象-如何让对象支持上下文管理

    如何让对象支持上下文管理 问题举例 一个telnet客户端的类TelnetClient, 调用实例的connect(),login(),interact方法 启动客户端与服务器交互,交互完毕后需要调用 ...

  6. ubuntu 下dns一类的处理

    如何关掉Ubuntu内置的dnsmasq服务 sudo vi /etc/NetworkManager/NetworkManager.conf找到dns=dnsmasq,在前面增加“#”,也就是把这句注 ...

  7. JavaWeb初级进阶高级学习方向计划

    阶段1 语言基础 课程一.Java负基础扫盲课 1.初识Java 本课程从java开发环境配置开始,讲解了java语法基础 .类和面向对象.面向对象编程三大特性:封装.继承.多态.建议零基础学员从本课 ...

  8. VS调试SQL Server存储过程

    1.打开VS,视图-->SQL Server对象资源管理器.(我用的是VS2012) 2.添加链接,连接到数据库. 3.选择要调试的存储过程,右键,选择调试过程或者执行过程. 4.填写存储过程所 ...

  9. FB面经Prepare: Merge K sorted Array

    Merge K sorted Array 跟Merge K sorted lists不同在于,从PQ里poll出来以后不知道下一个需要被加入PQ的是哪一个 所以需要写一个wrapper class p ...

  10. 请求http页面的相关过程

    http请求从TCP建立三次握手后进行,客户端按照规定的格式向服务器发送http请求,服务器在接收到这个请求之后,首先要对其进行解析,发掘出客户端所需要的相关资源,然后经过相应的业务逻辑处理,找到这个 ...