Qtree系列都跟树有着莫大的联系,这道题当然也不例外

我是题面

读完题,我们大概就知道了,这道题非常简单,可以说是模板题。树剖+线段树轻松解决

直接看代码吧

#include<algorithm>
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cctype>
#define ll long long
#define gc() getchar()
#define maxn 100010
using namespace std; inline ll read(){ //很朴素的快读,不多解释
ll a=0;int f=0;char p=gc();
while(!isdigit(p)){f|=p=='-';p=gc();}
while(isdigit(p)){a=(a<<3)+(a<<1)+(p^48);p=gc();}
return f?-a:a;
}
void write(ll a){ //很朴素的快写,也不多解释
if(a>9)write(a/10);
putchar(a%10+'0');
}
int n,a[maxn]; //a数组表示点与父亲连边的长度 int tot,head[maxn];
struct ahaha1{ //前向星存边
int w,to,next;
}e[maxn<<1];
inline void add(int u,int v,int w){
e[tot].w=w;e[tot].to=v;e[tot].next=head[u];head[u]=tot++;
} int f[maxn],sz[maxn],dep[maxn],son[maxn]; //f表示点的父亲,sz表示点的子树上节点个数,dep表示节点的深度,son表示子树最大的子节点
void dfs(int u,int fa){
int maxa=0;sz[u]=1;
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa)continue;
f[v]=u;dep[v]=dep[u]+1;a[v]=e[i].w;
dfs(v,u);sz[u]+=sz[v];
if(sz[v]>maxa)maxa=sz[v],son[u]=v;
}
}
int b[maxn],in[maxn],top[maxn]; //b表示当前编号所指向的点,in表示点的编号,top表示点所在链的顶端
void dfs(int u,int fa,int topf){
in[u]=++tot;b[tot]=u;top[u]=topf;
if(!son[u])return;
dfs(son[u],u,topf);
for(int i=head[u];~i;i=e[i].next){
int v=e[i].to;if(v==fa||v==son[u])continue;
dfs(v,u,v);
}
} #define lc p<<1
#define rc p<<1|1
struct ahaha2{ //线段树太简单不解释
int v;
}t[maxn<<2];
inline void pushup(int p){
t[p].v=max(t[lc].v,t[rc].v);
}
void build(int p,int l,int r){
if(l==r){t[p].v=a[b[l]];return;}
int m=l+r>>1;
build(lc,l,m);build(rc,m+1,r);
pushup(p);
}
void update(int p,int l,int r,int L,int z){
if(l==r){t[p].v=z;return;}
int m=l+r>>1;
if(m>=L)update(lc,l,m,L,z);
else update(rc,m+1,r,L,z);
pushup(p);
}
int query(int p,int l,int r,int L,int R){
if(l>R||r<L)return 0;
if(L<=l&&r<=R)return t[p].v;
int m=l+r>>1;
return max(query(lc,l,m,L,R),query(rc,m+1,r,L,R));
} inline void solve_1(){ //从第0条边开始存,每条边存两次,所以输入的第i条边对应的是第2*i-2和第2*i-1条边,谁是儿子改谁
int x=read()*2-2,w=read(),u=e[x].to,v=e[x+1].to;
if(f[v]==u)update(1,1,n,in[v],w);
else update(1,1,n,in[u],w);
}
inline void solve_2(){ //链上查询
int x=read(),y=read(),ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,query(1,1,n,in[top[x]],in[x])); //由于存的是与父亲的距离,而top的父亲直接取所以此处无需加1
x=f[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
ans=max(ans,query(1,1,n,in[x]+1,in[y])); //但是最后一次存储必须加1否则会多询问一条边
write(ans);putchar('\n');
} int main(){memset(head,-1,sizeof head);
n=read();
for(int i=1;i<n;++i){
int x=read(),y=read(),w=read();
add(x,y,w);add(y,x,w);
}
tot=0;dfs(1,-1);dfs(1,-1,1);
build(1,1,n);
char z[10];
while(1){
scanf("%s",z);
if(z[0]=='D')break;
switch(z[0]){
case 'C':solve_1();break;
case 'Q':solve_2();break;
}
}
return 0;
}

洛谷 P4114 Qtree1的更多相关文章

  1. 洛谷 P4114 Qtree1 树链剖分

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

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

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

  3. 洛谷P4114 Qtree1

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

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

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

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

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

  6. 洛谷.4114.Qtree1(树链剖分)

    题目链接 模板题都错了这么多次.. //边权赋到点上 树剖模板 //注意LCA.链的顶端不能统计到答案! #include <cstdio> #include <cctype> ...

  7. 洛谷1640 bzoj1854游戏 匈牙利就是又短又快

    bzoj炸了,靠离线版题目做了两道(过过样例什么的还是轻松的)但是交不了,正巧洛谷有个"大牛分站",就转回洛谷做题了 水题先行,一道傻逼匈牙利 其实本来的思路是搜索然后发现写出来类 ...

  8. 洛谷P1352 codevs1380 没有上司的舞会——S.B.S.

    没有上司的舞会  时间限制: 1 s  空间限制: 128000 KB  题目等级 : 钻石 Diamond       题目描述 Description Ural大学有N个职员,编号为1~N.他们有 ...

  9. 洛谷P1108 低价购买[DP | LIS方案数]

    题目描述 “低价购买”这条建议是在奶牛股票市场取得成功的一半规则.要想被认为是伟大的投资者,你必须遵循以下的问题建议:“低价购买:再低价购买”.每次你购买一支股票,你必须用低于你上次购买它的价格购买它 ...

随机推荐

  1. Phaser Matter Collision Plugin 碰撞插件 -- iFiero技术分享

    collision-simple-demo Phaser 自带的Arcade虽然易用,但复杂的物理碰撞明显就不够用了,于是Matter等物理引擎还是不得不学的,以下是Matter物理体碰撞的一个插件, ...

  2. leetcode- 将有序数组转换为二叉搜索树(java)

    将一个按照升序排列的有序数组,转换为一棵高度平衡二叉搜索树. 本题中,一个高度平衡二叉树是指一个二叉树每个节点 的左右两个子树的高度差的绝对值不超过 1. 示例: 给定有序数组: [-10,-3,0, ...

  3. 苹果全球营销高级副总裁Phil Schiller曾考虑炒掉长期创意代理商Media Arts Lab

    来自<华尔街日报>消息,从去年开始,三星就利用广告来讽刺苹果产品.苹果全球营销高级副总裁菲尔•席勒(Phil Schiller)曾一度考虑炒掉该公司的长期创意代理商Media Arts L ...

  4. Java反编译插件

    一.eclipse->help->Eclipse Marketplace 如下图:搜索JadClipse,install进行下载安装,

  5. spring mvc ajaxfileupload文件上传返回json下载问题

    问题:使用spring mvc ajaxfileupload 文件上传在ie8下会提示json下载问题 解决方案如下: 服务器代码: @RequestMapping(value = "/ad ...

  6. mysql基础知识大全

    前言:本文主要为mysql基础知识的大总结,mysql的基础知识很多,这里作简单概括性的介绍,具体的细节还是需要自行搜索.当然本文还有很多遗漏的地方,后续会慢慢补充完善. 数据库和数据库软件 数据库是 ...

  7. (转)一篇写的简明易懂的logging模块

    转:http://kenby.iteye.com/blog/1162698 一.从一个使用场景开始 开发一个日志系统, 既要把日志输出到控制台, 还要写入日志文件 import logging # 创 ...

  8. underscore.js源码解析(五)—— 完结篇

    最近公司各种上线,所以回家略感疲惫就懒得写了,这次我准备把剩下的所有方法全部分析完,可能篇幅过长...那么废话不多说让我们进入正题. 没看过前几篇的可以猛戳这里: underscore.js源码解析( ...

  9. 第一次作业(homework-01)成绩公布

    已收到博客名.github名的同学得分列表: 学号后三位 成绩(0-10) 215 8082 0132 5184 5027 7194 9.5157 7074 8195 6222 8158 6128 8 ...

  10. Learn Docker(一)—软件安装与常规操作

    一.安装Docker Windows平台 在Windows10 X64专业版上可以直接下载Docker原生应用进行安装,在控制面板的程序与功能里启用Hyper-v,之后就可以运行docker程序啦. ...