SPOJ - QTREE Query on a tree题解
题目大意:
一棵树,有边权,有两个操作:1.修改一条边的权值;2.询问两点间路径上的边的权值的最大值。
思路:
十分裸的树链剖分+线段树,无非是边权要放到深度大的一端的点上,但是有两个坑爹的地方,改了好久:
1.数组定义10000和40000会TLE,要乘10;
2.以前的树剖求解的最后是这样的:
if (deep[x]>deep[y]) swap(x,y);
return max(ans,MAX(,n,id[x],id[y],));
但是WA了,膜拜大神后发现这样就AC了:
if (x==y) return ans;
if (dep[x]>dep[y]) swap(x,y);
return max(ans,ask(,n,id[x]+,id[y],));
以前应该是错了。
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int M=;
int n,cnt,t,p[M],hea[M],size[M],v[M],a[M],b[M],c[M],nex[M],dep[M],top[M],id[M],tree[M<<];
char s[M]; bool vis[M]; int read()
{
int x=; bool f=; char ch=getchar();
while (ch<'' || ch>'') { if (ch=='-') f=; ch=getchar(); }
while (ch>='' && ch<='') x=(x<<)+(x<<)+ch-,ch=getchar();
return f?-x:x;
} void add(int x,int y) { v[++cnt]=y,nex[cnt]=hea[x],hea[x]=cnt; } void dfs1(int x,int fa,int h)
{
size[x]=,dep[x]=h,p[x]=fa;
for (int i=hea[x],y;i;i=nex[i])
if ((y=v[i])^fa) dfs1(y,x,h+),size[x]+=size[y];
} void dfs2(int x,int chain)
{
int i,k=,y;
id[x]=++t,top[x]=chain;
for (i=hea[x];i;i=nex[i])
if (size[y=v[i]]>size[k] && y^p[x]) k=y;
if (!k) return; dfs2(k,chain);
for (i=hea[x];i;i=nex[i])
if ((y=v[i])^p[x] && k^y) dfs2(y,y);
} void push_up(int k) { tree[k]=max(tree[k<<],tree[k<<|]); } void change(int L,int R,int x,int val,int cur)
{
if (L==R) { tree[cur]=val; return; }
int mid=L+R>>;
if (x>mid) change(mid+,R,x,val,cur<<|);
else change(L,mid,x,val,cur<<);
push_up(cur);
} int ask(int L,int R,int l,int r,int cur)
{
if (l<=L && R<=r) return tree[cur];
int mid=L+R>>;
if (r<=mid) return ask(L,mid,l,r,cur<<);
else if (l>mid) return ask(mid+,R,l,r,cur<<|);
else return max(ask(L,mid,l,mid,cur<<),ask(mid+,R,mid+,r,cur<<|));
} int qry(int x,int y)
{
int ans=-;
for (;top[x]^top[y];x=p[top[x]])
{
if (dep[top[x]]<dep[top[y]]) swap(x,y);
ans=max(ans,ask(,n,id[top[x]],id[x],));
}
if (x==y) return ans;
if (dep[x]>dep[y]) swap(x,y);
return max(ans,ask(,n,id[x]+,id[y],));
} int main()
{
for (int T=read(),i;T;--T)
{
n=read(),cnt=t=;
for (i=;i<=n;++i) hea[i]=;
for (i=;i<n;++i)
{
a[i]=read(),b[i]=read(),c[i]=read();
add(a[i],b[i]),add(b[i],a[i]);
}
dfs1(,,),dfs2(,);
for (i=;i<n;++i)
{
if (dep[a[i]]<dep[b[i]]) swap(a[i],b[i]);
change(,n,id[a[i]],c[i],);
}
for (;;)
{
scanf("%s",s);
if (s[]=='D') break;
int x=read(),y=read();
if (s[]=='C') change(,n,id[a[x]],y,);
if (s[]=='Q') printf("%d\n",qry(x,y));
}
}
return ;
}
SPOJ - QTREE Query on a tree题解的更多相关文章
- 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 QTREE - Query on a tree(树链剖分+线段树单点更新,区间查询)
传送门:Problem QTREE https://www.cnblogs.com/violet-acmer/p/9711441.html 题解: 树链剖分的模板题,看代码比看文字解析理解来的快~~~ ...
- SPOJ QTREE Query on a tree --树链剖分
题意:给一棵树,每次更新某条边或者查询u->v路径上的边权最大值. 解法:做过上一题,这题就没太大问题了,以终点的标号作为边的标号,因为dfs只能给点分配位置,而一棵树每条树边的终点只有一个. ...
- SPOJ QTREE Query on a tree VI
You are given a tree (an acyclic undirected connected graph) with n nodes. The tree nodes are number ...
- SPOJ QTREE Query on a tree V
You are given a tree (an acyclic undirected connected graph) with N nodes. The tree nodes are number ...
- SPOJ QTREE Query on a tree ——树链剖分 线段树
[题目分析] 垃圾vjudge又挂了. 树链剖分裸题. 垃圾spoj,交了好几次,基本没改动却过了. [代码](自带常数,是别人的2倍左右) #include <cstdio> #incl ...
- SPOJ QTREE - Query on a tree 【树链剖分模板】
题目链接 引用到的大佬博客 代码来自:http://blog.csdn.net/jinglinxiao/article/details/72940746 具体算法讲解来自:http://blog.si ...
- SPOJ QTREE Query on a tree
题意:给一颗n个点的树,有两种操作CHANGE i ti : 把第i条边的权变为tiQUERY a b : 问点a 到 点b 之间的边的最大权 思路:树剖处理边权.由于是边,所以只需要把边权处理到子节 ...
- SPOJ QTREE Query on a tree V ——动态点分治
[题目分析] QTREE4的弱化版本 建立出分治树,每个节点的堆表示到改点的最近白点距离. 然后分治树上一直向上,取min即可. 正确性显然,不用担心出现在同一子树的情况(不会是最优解),请自行脑补. ...
随机推荐
- Tarjan UVALive 6511 Term Project
题目传送门 /* 题意:第i个人选择第a[i]个人,问组成强联通分量(自己连自己也算)外还有多少零散的人 有向图强联通分量-Tarjan算法:在模板上加一个num数组,记录每个连通分量的点数,若超过1 ...
- 题解报告:hdu 5750 Dertouzos(最大真约数、最小素因子)
Problem Description A positive proper divisor is a positive divisor of a number n, excluding n itsel ...
- 有关LD_LIBRARY_PATH与ld.so.conf
我之前写过一篇关于LD_LIBRARY_PATH与gcc/g++ -L的关系的文章,于是我自己用CPACK制作了一个Debian安装包,然后我在/home/.bashrc里添加了export LD_L ...
- VUE学习,is 特性,转载来源:https://segmentfault.com/q/1010000007205176/
- CCF|最小差值|Java
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = ...
- 读取Java文件到byte数组的三种方式
package zs; import java.io.BufferedInputStream; import java.io.ByteArrayOutputStream; import java.io ...
- 虚拟机centOs Linux与Windows之间的文件传输
一.配置环境 虚拟机Linux:Fedora 9 文件传输工具:SSHSecureShellClient-3.2.9 二.实现步骤 1. 在Windows中安装文件传输工具SSHSecureShell ...
- iTOP-4412开发板全新升级支持4G全网通模块
开发板支持4G,GPS,CAN,485,WIFI蓝牙,重力加速度计,陀螺仪等模块. 核心板参数 尺寸:6cm*7cm 高度:连同连接器在内0.26cm CPU:Exynos4412,四核Cortex- ...
- 飞思卡尔开发板-迅为IMX6开兼容单核 双核 四核Plus开发板
飞思卡尔开发硬件接口介绍: 核心板参数 尺寸:51mm*61mm CPU:Freescale Cortex-A9 四核 i.MX6Q,主频 1.2 GHz 内存:2GB DDR3 存储:16GB EM ...
- Laravel Passport认证-多表、多字段解决方案
Laravel Passport认证-多表.多字段解决方案 2018年08月19日 09:31:01 醉卧码场君莫笑 阅读数:1632 1. 概述 API 通常使用令牌(token)进行认证并且在 ...