Luogu4114 Qtree1
原题链接: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相关推荐
- 洛谷P4114 Qtree1(树链剖分+线段树)
传送门 LCT秒天秒地用什么树剖 这题可以算是树剖的比较裸的题目了 把每一条边的权值下放到他两边的点中深度较深的那个 然后直接用树剖+线段树带进去乱搞就可以了 1 //minamoto 2 #incl ...
- 【Qtree】Query on a tree系列LCT解法
Qtree1-7 Qtree1 裸的树链剖分,当然也可以用LCT写,就不说什么了... Qtree2 倍增lca,当然也可以用LCT写,就不说什么了... Qtree3 裸的树链剖分,当然也可以用LC ...
- QTREE系列1,4,5,6,7 LCT
QTREE1 题意: 给出一棵N(N <= 10000)个点的树,要求支持: 1.改变第i条边的权值 2.求a->b上的最大边权 解: 直接树剖或LCT即可 代码 1.LCT(660ms) ...
- Qtree LCT系列
Qtree1,2,3暂缺 Qtree4思路 总是有机房大佬问我怎么做(抄题解不就好了吗?),那我就讲一讲我紊乱的思路吧. 应该不难想到边权下放到子节点,有了这个基础,我们对细节的处理就不用那么模糊了. ...
最新文章
- ES的跨索引查询有多便利?对比下分库分表、分片更直观
- html5-article元素
- 一个html文档所需要的最基本的标记对是,川大《WEB技术》19秋在线作业1题目【标准答案】...
- can a select block a truncate (ZT)
- Hyper-V 和Ubuntu Server 16.04 配置静态IP
- mysql---复杂的sql语句join的使用(left join,right join)
- 执行Dockerfile构建基础镜像,建立python工作环境
- MySQL外键命名规范
- 【前端】书签应用开发总结
- Netflix是如何针对云构建和部署代码的
- Kafka 各版本下载指南
- TCPUDP调试工具 Linux 版
- 10.计蒜客ACM题库.A1007 作弊揭发者
- 订阅号与服务号的区别
- 计算机外联管理办法,外联部管理制度
- 计算机专业群名有内涵,有内涵高大上的群名
- shell学习笔记:变量篇
- 数据库连接驱动介绍及参数简单设置
- 数据库隔离级别解决脏读、不可重复读、幻读
- 华为模拟器dhcp中继