题目:https://codeforc.es/gym/101810/problem/M

题意:给 你一颗树,下面有m次查询,求u->v的最大值是多少,输入两点之间都会有两条边,正边有正权,反边有反权,然后问u->v可以经过的最大权值是多少

思路:我们首先以u为根我们会发现我们走非v所在子树时我们都可以把所有边走完并且回来,对于v所在子树我们也可以把正反两条边都走完,u-v的最短的那条路只能走一遍,所以这个问题就转化为了求最长链问题,u->v的最长链,但是我们有m次查询,我们不可能每次取遍历所有的点来找最长链,我们其实可以以1为根,然后用两个数组分别记录 当前点到根的距离的正反权,然后自己画图能够看出两点的距离其实就是   dis1[u]-dis1[lca(u,v)]  +  dis2[v]-dis2[lca(u,v)]

#include<bits/stdc++.h>
using namespace std;
#define mst(ss,b) memset((ss),(b),sizeof(ss))
const int N = 1e5+;
int t,n,m,dis[N],dis1[N],fa[N][],fa1[N][],dep[N],dep1[N],vs[N],vs1[N];
struct nd{
int to,w,w1;
};
vector<nd> g[N]; void init() {
for(int i=;i<=n;i++) g[i].clear();
mst(dis,),mst(fa,),mst(dep,),mst(vs,);
mst(dis1,),mst(fa1,),mst(dep1,),mst(vs1,);
} void dfs(int x) {///求出每个节点到根节点的距离、深度、父亲
vs[x]=;
for(int i=;i<g[x].size();i++) {
nd tp=g[x][i];
int v=tp.to,w=tp.w,w1=tp.w1;
if(vs[v]) continue;
fa[v][]=x;
fa1[v][]=x;
dis[v]=dis[x]+w;
dis1[v]=dis1[x]+w1;
dep[v]=dep[x]+;
dep1[v]=dep1[x]+;
dfs(v);
}
} void bz() {///倍增预处理
for(int j=;j<;j++)///fa[i][j]表示结点 i 的第2^j个祖先
for(int i=;i<=n;i++)
fa[i][j]=fa[fa[i][j-]][j-],
fa1[i][j]=fa1[fa1[i][j-]][j-];
} int lca(int u,int v) {
if(dep[u]<dep[v]) swap(u,v);///注意是交换u和v,不是交换dep[u]和dep[v]
int d=dep[u]-dep[v];
for(int i=;i<;i++)///先调整到同一深度
if(d&(<<i)) u=fa[u][i];
if(u==v) return u;
for(int i=;i>=;i--) {///注意是倒着for,二进制拆分,从大到小尝试
if(fa[u][i]!=fa[v][i]) {
u=fa[u][i];
v=fa[v][i];
}
}
return fa[u][];
} int main() {
while(~scanf("%d",&t)) {
while(t--) {
scanf("%d",&n);
init();
long long ans = ;
for(int i=;i<n;i++) {
int a,b,c,d;
scanf("%d%d%d%d",&a,&b,&c,&d);
g[a].push_back({b,c,d});
g[b].push_back({a,d,c});
ans += c+d;
}
dep[]=,dis[]=;
dep1[]=,dis1[]=;
dfs();
bz();
scanf("%d",&m);
for(int i=;i<=m;i++) {
int u,v;
scanf("%d%d",&u,&v);
printf("%lld\n",ans-(dis1[v]-dis1[lca(u,v)]+dis[u]-dis[lca(u,v)]));
}
}
}
return ;
}

gym 101810 M. Greedy Pirate (LCA)的更多相关文章

  1. GYM101810 ACM International Collegiate Programming Contest, Amman Collegiate Programming Contest (2018) M. Greedy Pirate (LCA)

    题意:有\(n\)个点,\(n-1\)条边,每条边正向和反向有两个权值,且每条边最多只能走两次,有\(m\)次询问,问你从\(u\)走到\(v\)的最大权值是多少. 题解:可以先在纸上画一画,不难发现 ...

  2. codeforces gym #101161E - ACM Tax(lca+主席树)

    题目链接: http://codeforces.com/gym/101161/attachments 题意: 给出节点数为$n$的树 有$q$次询问,输出$a$节点到$b$节点路程中,经过的边的中位数 ...

  3. Codeforces Gym 100015C City Driving 离线LCA

    City Driving 题目连接: http://codeforces.com/gym/100015/attachments Description You recently started fre ...

  4. Gym 101810

    友情提示: 这篇题解并没有GJKL,因为我也不会,而且看别人代码也看不懂,而且问学长还不给我讲!hmc:这个题巨麻烦,我只能说balabala.我不学了我退役了啊! A:这傻逼题我从开头wa了四个小时 ...

  5. gym 101889I Imperial roads 最小生成树+LCA

    题目传送门 题意: 给出一幅无向带权图,q次询问,每次询问都求一棵包含给出的边的最小生成树. 思路: 首先求出最小生成树(kruskal),如果查询的边在最小生成树上,肯定是直接输出最小生成树,如果不 ...

  6. Gym - 101810H ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include <bits/stdc++.h> using namespace std; #de ...

  7. Gym - 101810F ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include<bits/stdc++.h> using namespace std; #def ...

  8. Gym - 101810E ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include<bits/stdc++.h> using namespace std; #def ...

  9. Gym - 101810D ACM International Collegiate Programming Contest (2018)

    bryce1010模板 http://codeforces.com/gym/101810 #include <bits/stdc++.h> using namespace std; #de ...

随机推荐

  1. 简单了解winform

    WinForm是·Net开发平台中对Windows Form的一种称谓. Windows窗体可用于设计窗体和可视控件,以创建丰富的基于Windows的窗体应用程序.可以访问数据库中的数据,并在窗体上显 ...

  2. Grafana 下载与安装(v5.4.1)

    官网地址: https://grafana.com/grafana/download Linux Ubuntu & Debian(64 Bit) SHA256: 3ccbdba9e7429f5 ...

  3. STL之pair及其非成员函数make_pair()

    std::pair是一个结构模板,提供了一种将两个异构对象存储为一个单元的方法. 定义于头文件 <utility> template< class T1, class T2 > ...

  4. Java8 Nashorn JavaScript引擎

    使用Java8,Nashorn大大提高了JavaScript 引擎引入,以取代现有的Nashorn Java脚本引擎.Nashorn提供2至10倍更好的性能,因为它直接编译代码在存储器,并传递到字节码 ...

  5. python-生成式的基本使用

    生成式是python中的一种高级玩法,起码看起来显得要高级一点.它可以使用简单的一行代码实现列表.字典等数据类型的创建或数据类型的转换等任务.另外,它和生成器还有些许关联. 列表生成式 列表生成式即生 ...

  6. jmeter:清除本地指定目录下的所有类型文件

    1,创建一个sampler 2,要在本地有一个目录的文件 3,直接上代码 String path = "C:\\临时文件\\test111" ;         File file ...

  7. CentnOS7安装Nginx“No package available”

    Nginx相对Apache有轻量级,简洁的优点,算得上Apache的优秀替代品了,但是由于Nginx不在yum的官方源中,因此安装时总会出现失败的现象,只需: yum install epel-rel ...

  8. 如何写一个简单的基于 Qt 框架的 HttpServer ?

    httpserver.h #ifndef HTTPSERVER_H #define HTTPSERVER_H #include <QObject> #include <QtCore& ...

  9. falcon的api

    一.判断session是否有效 # -*- coding: UTF- -*- #!/usr/bin/env python # Created by Administrator on // import ...

  10. 【转载】Spring bean 中 constructor-arg属性

    转载地址:https://blog.csdn.net/qq_27292113/article/details/78063696 方便以后查阅