SPOJ375 Query on a tree(树链剖分)
题意
给出一棵树,每条边都有权值,有两种操作:
- 把第p条边的权值改为x
- 询问x,y路径上的权值最大的边
code
#include<cstdio>
#include<algorithm>
#include<cstring>
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1 using namespace std; const int N = ;
struct Edge {
int to,nxt,w;
}e[];
int head[N],tot,tn,n;
int deth[N],son[N],fa[N],siz[N],bel[N],pos[N];
int mx[N<<],a[N],b[N],c[N],data[N]; void init() {
tot = tn = ;
memset(head,,sizeof(head));
memset(son,,sizeof(son));
}
inline void add_edge(int u,int v,int w) {
e[++tot].to = v,e[tot].w = w,e[tot].nxt = head[u],head[u] = tot;
}
void dfs1(int u,int pa) {
siz[u] = ;
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v==pa) continue;
fa[v] = u;
deth[v] = deth[u] + ;
dfs1(v,u);
siz[u] += siz[v];
if (son[u]== || siz[v] > siz[son[u]]) son[u] = v;
}
}
void dfs2(int u,int top) {
pos[u] = ++tn;
bel[u] = top;
if (!son[u]) return ;
dfs2(son[u],top);
for (int i=head[u]; i; i=e[i].nxt) {
int v = e[i].to;
if (v != fa[u] && v != son[u]) dfs2(v,v);
}
}
void pushup(int rt) {
mx[rt] = max(mx[rt<<],mx[rt<<|]);
}
void build(int l,int r,int rt) {
if (l==r) {
mx[rt] = data[l];return ;
}
int m = (l + r) >> ;
build(lson);
build(rson);
pushup(rt);
}
void update(int l,int r,int rt,int p,int x) {
if (l==r) {
mx[rt] = x;return ;
}
int m = (l + r) >> ;
if (p <= m) update(lson,p,x);
else update(rson,p,x);
pushup(rt);
}
int query(int l,int r,int rt,int L,int R) {
if (L <= l && r <= R) {
return mx[rt];
}
int m = (l + r) >> ;
int ret = -1e9;
if (L <= m) ret = max(ret,query(lson,L,R));
if (R > m) ret = max(ret,query(rson,L,R));
return ret;
}
void Change(int p,int x) {
if (deth[a[p]] > deth[b[p]]) update(,n,,pos[a[p]],x);
else update(,n,,pos[b[p]],x);
}
int Ask(int x,int y) {
int ans = -1e9;
while (bel[x] != bel[y]) {
if (deth[bel[x]] < deth[bel[y]]) swap(x,y);
ans = max(ans,query(,n,,pos[bel[x]],pos[x]));
x = fa[bel[x]];
}
if (deth[x] > deth[y]) swap(x,y);
if (x != y) ans = max(ans,query(,n,,pos[x]+,pos[y]));
return ans;
}
int main() {
char opt[];
int T;scanf("%d",&T);
while (T--) {
init();
scanf("%d",&n);
for (int i=; i<n; ++i) {
scanf("%d%d%d",&a[i],&b[i],&c[i]);
add_edge(a[i],b[i],c[i]);
add_edge(b[i],a[i],c[i]);
}
deth[] = ;
dfs1(,);
dfs2(,);
for (int i=; i<n; ++i) {
if (deth[a[i]] > deth[b[i]]) data[pos[a[i]]] = c[i]; // 一定是pos
else data[pos[b[i]]] = c[i];
}
build(,n,);
scanf("%s",opt);
while (opt[]!='D') {
int x,y;
scanf("%d%d",&x,&y);
if (opt[]=='Q') printf("%d\n",Ask(x,y));
else Change(x,y);
scanf("%s",opt);
}
}
return ;
}
SPOJ375 Query on a tree(树链剖分)的更多相关文章
- Query on a tree——树链剖分整理
树链剖分整理 树链剖分就是把树拆成一系列链,然后用数据结构对链进行维护. 通常的剖分方法是轻重链剖分,所谓轻重链就是对于节点u的所有子结点v,size[v]最大的v与u的边是重边,其它边是轻边,其中s ...
- SPOJ Query on a tree 树链剖分 水题
You are given a tree (an acyclic undirected connected graph) with N nodes, and edges numbered 1, 2, ...
- spoj QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)
传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...
- SPOJ QTREE Query on a tree 树链剖分+线段树
题目链接:http://www.spoj.com/problems/QTREE/en/ QTREE - Query on a tree #tree You are given a tree (an a ...
- spoj 375 Query on a tree (树链剖分)
Query on a tree You are given a tree (an acyclic undirected connected graph) with N nodes, and edges ...
- spoj 375 QTREE - Query on a tree 树链剖分
题目链接 给一棵树, 每条边有权值, 两种操作, 一种是将一条边的权值改变, 一种是询问u到v路径上最大的边的权值. 树链剖分模板. #include <iostream> #includ ...
- SPOJ QTREE Query on a tree ——树链剖分 线段树
[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...
- SPOJ 375 Query on a tree 树链剖分模板
第一次写树剖~ #include<iostream> #include<cstring> #include<cstdio> #define L(u) u<&l ...
- SPOJ QTREE Query on a tree --树链剖分
题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...
随机推荐
- Bootcamp Win10蓝牙鼠标的问题
运行services.msc找到Bluetooth support service 把启动类型从手动改为自动 重新连接蓝牙鼠标
- springboot项目实现批量新增功能
这个困扰我一整天东西,终于解决了. 首先是mybatis中的批量新增sql语句. 注意:这里我给的是我需要新增的字段,你们改成你们需要的字段. <insert id="insertBa ...
- 多线程(Thread、线程创建、线程池)
第1章 多线程 1.1 多线程介绍 学习多线程之前,我们先要了解几个关于多线程有关的概念. 进程:进程指正在运行的程序.确切的来说,当一个程序进入内存运行,即变成一个进程,进程是处于运行过程中的程 ...
- cf519D. A and B and Interesting Substrings(前缀和)
题意 给出$26$个字母对应的权值和一个字符串 问满足以下条件的子串有多少 首尾字母相同 中间字母权值相加为0 Sol 我们要找到区间满足$sum[i] - sum[j] = 0$ $sum[i] = ...
- 2、HTTP状态码
HTTP状态码 当浏览者访问一个网页时,浏览者的浏览器会向网页所在服务器发出请求.当浏览器接收并显示网页前,此网页所在的服务器会返回一个包含HTTP状态码的信息头(server header)用以响应 ...
- Godaddy虚拟主机新建mysql数据库 2019最新
第一次用狗爹,完全摸不着路子. 网站本地已搭建,不知道数据库是在哪里上传. 百度搜索结果都是四五年前的旧内容,耽误时间. 还是问客服,Godaddy的客服确实不赖 godaddy虚拟主机如何新建数据库 ...
- IDEA的第一个JavaEE项目&集成Tomcat、Jrebel、Git插件
创建第一个JavaEE项目 Next之后选择项目存储位置之后点击Finish即可. 新建的项目需要新建两个文件夹classes和lib 集成Tomcat Tomcat自行到官网下载 JRebel集成 ...
- python 之format字符串格式化
print函数之format字符串格式化方法的使用与学习笔记. 一.映射关系 (1)“映射”示例,以下通过位置举例说明: [+]Example_1: >>> print(" ...
- COGS 2104. [NOIP2015]神奇的幻方
★ 输入文件:2015magic.in 输出文件:2015magic.out 简单对比时间限制:1 s 内存限制:256 MB 模拟 一开始数组开小了.. 屠龙宝刀点击就送 #incl ...
- Codevs 1860 最大数
题目描述 Description 设有n个正整数(n≤20),将它们联接成一排,组成一个最大的多位整数. 输入描述 Input Description 第一行一个正整数n. 第二行n个正整数,空格隔开 ...