原题链接:https://www.luogu.org/problemnew/show/P4114

Qtree1

题目背景

数据规模和spoj上有所不同

题目描述

给定一棵n个节点的树,有两个操作:

CHANGE i ti 把第i条边的边权变成ti

QUERY a b 输出从a到b的路径中最大的边权,当a=b的时候,输出0

输入输出格式
输入格式:

第一行输入一个n,表示节点个数

第二行到第n行每行输入三个数,ui,vi,wi,分别表示 ui,vi有一条边,边权是wi

第n+1行开始,一共有不定数量行,每一行分别有以下三种可能

CHANGE,QUERY同题意所述

DONE表示输入结束

输出格式:

对于每个QUERY操作,输出一个数,表示a b之间边权最大值

输入输出样例
输入样例#1:

3
1 2 1
2 3 2
QUERY 1 2
CHANGE 1 3
QUERY 1 2
DONE

输出样例#1:

1
3

说明

数据保证:

1≤≤n≤≤1051 \leq≤ n \leq≤ 10^51≤≤n≤≤105

操作次数 ≤≤3∗105\leq≤ 3* 10^5≤≤3∗105

wi和ti$ \leq≤ 2^{31}-1$

题解

Qtree应该是经典的树链剖分题目了吧,所以我们用LCT\mathcal{LCT}LCT来做这道题。。。

我们把一条边变成点来维护,改边权的时候直接修改点权,再维护个最大值即可。

LCT\mathcal{LCT}LCT常数是真的大,要开inlineregister\mathcal{inline\ register}inline register才能过。。。

代码
#include<bits/stdc++.h>
#define I inline void
#define R register int
#define ls son[v][0]
#define rs son[v][1]
using namespace std;
const int M=2e5+5;
int n,q,dad[M],son[M][2],val[M],mx[M],sta[M];
bool rev[M];
inline bool notroot(R v){return son[dad[v]][0]==v||son[dad[v]][1]==v;}
I up(R v){mx[v]=max(val[v],max(mx[ls],mx[rs]));}
I turn(R v){swap(ls,rs);rev[v]^=1;}
I push(R v){if(!rev[v])return;if(ls)turn(ls);if(rs)turn(rs);rev[v]=0;}
I spin(R v)
{int f=dad[v],ff=dad[f],k=son[f][1]==v,w=son[v][!k];if(notroot(f))son[ff][son[ff][1]==f]=v;son[v][!k]=f;son[f][k]=w;if(w)dad[w]=f;dad[f]=v;dad[v]=ff;up(f);up(v);
}
I splay(R v)
{int f,ff,top=0,u=v;sta[++top]=u;while(notroot(u))sta[++top]=u=dad[u];while(top)push(sta[top--]);while(notroot(v)){f=dad[v];ff=dad[f];if(notroot(f))spin((son[f][0]==v)^(son[ff][0]==f)?v:f);spin(v);}
}
I access(int v){for(R f=0;v;v=dad[f=v])splay(v),rs=f,up(v);}
I beroot(int v){access(v);splay(v);turn(v);}
I split(int x,int y){beroot(x);access(y);splay(y);}
I link(int x,int y){beroot(x);dad[x]=y;}
void in()
{int a,b,c;scanf("%d",&n);for(R i=1;i<n;++i){scanf("%d%d%d",&a,&b,&c);val[i+n]=c;mx[i+n]=c;link(a,i+n);link(b,i+n);}
}
void ac()
{int a,b;char ch[10];while(scanf("%s",ch)&&ch[0]!='D'){scanf("%d%d",&a,&b);if(ch[0]=='Q'){split(a,b);printf("%d\n",mx[b]);}else {splay(a+n);val[a+n]=b;up(a+n);}}
}
int main()
{in();ac();return 0;
}

Luogu4114 Qtree1相关推荐

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

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

  2. 【Qtree】Query on a tree系列LCT解法

    Qtree1-7 Qtree1 裸的树链剖分,当然也可以用LCT写,就不说什么了... Qtree2 倍增lca,当然也可以用LCT写,就不说什么了... Qtree3 裸的树链剖分,当然也可以用LC ...

  3. QTREE系列1,4,5,6,7 LCT

    QTREE1 题意: 给出一棵N(N <= 10000)个点的树,要求支持: 1.改变第i条边的权值 2.求a->b上的最大边权 解: 直接树剖或LCT即可 代码 1.LCT(660ms) ...

  4. Qtree LCT系列

    Qtree1,2,3暂缺 Qtree4思路 总是有机房大佬问我怎么做(抄题解不就好了吗?),那我就讲一讲我紊乱的思路吧. 应该不难想到边权下放到子节点,有了这个基础,我们对细节的处理就不用那么模糊了. ...

最新文章

  1. ES的跨索引查询有多便利?对比下分库分表、分片更直观
  2. html5-article元素
  3. 一个html文档所需要的最基本的标记对是,川大《WEB技术》19秋在线作业1题目【标准答案】...
  4. can a select block a truncate (ZT)
  5. Hyper-V 和Ubuntu Server 16.04 配置静态IP
  6. mysql---复杂的sql语句join的使用(left join,right join)
  7. 执行Dockerfile构建基础镜像,建立python工作环境
  8. MySQL外键命名规范
  9. 【前端】书签应用开发总结
  10. Netflix是如何针对云构建和部署代码的
  11. Kafka 各版本下载指南
  12. TCPUDP调试工具 Linux 版
  13. 10.计蒜客ACM题库.A1007 作弊揭发者
  14. 订阅号与服务号的区别
  15. 计算机外联管理办法,外联部管理制度
  16. 计算机专业群名有内涵,有内涵高大上的群名
  17. shell学习笔记:变量篇
  18. 数据库连接驱动介绍及参数简单设置
  19. 数据库隔离级别解决脏读、不可重复读、幻读
  20. 华为模拟器dhcp中继

热门文章

  1. 使用WWWGrep检查你的网站元素安全
  2. 一台电脑安装多个Chrome
  3. 神经网络与深度学习第6章:循环神经网络 阅读提问
  4. java 挂起_Java 6 JVM挂起
  5. Netty学习(三)高性能之ByteBuf源码解析(篇幅较长)
  6. Python3 面向对象之:多继承
  7. 2.3 利用FTP服务器下载和上传文件
  8. iOS打包后收不到推送信息
  9. Linux下更改目录及其下的子目录和文件的访问权限
  10. iptables 端口转发--内网实现上网