ST和LCA和无根树连接
#include <stdio.h>
#include <iostream>
#include <string.h>
#include <algorithm>
#include <string>
#include<cstdio>
#include<vector>
#include<cmath>
#include <queue>
#include <map>
#include <vector>
#define ll __int64
#define mp make_pair<int, int>
using namespace std;
#define de(x) cout << #x << "=" << x << endl
const int maxn=50000+10;
int fa[maxn]={0};
int f[25][maxn]={0};
int len[25][maxn]={0};
int depth[maxn]={0};
vector<pair<int, int> > edge[maxn*2];
void dfs(int a)
{
depth[a]=depth[f[0][a]]+1;
for(int i=1;(1<<i)<=depth[a];i++)
{
f[i][a]=f[i-1][f[i-1][a]];
len[i][a]=len[i-1][f[i-1][a]]+len[i-1][a];
}
fa[a]=1;
for(int i=0;i<edge[a].size();i++)
{
int j=edge[a][i].first;
int k=edge[a][i].second;
if(!fa[j])
{
fa[j]=1;
f[0][j]=a;
len[0][j]=k;
dfs(j);
}
}
}
int ST(int a,int b)
{
int ans=0; if(depth[a]<depth[b]) swap(a,b);
for(int i=19,d=depth[a]-depth[b];i>=0;i--)
{
//cout<<"djfhjaksfhjkasfjk";
if(d>>i&1)//是一个&不是两个,因为这个wa了一个下午 ,ri!
{
//de(i);
ans+=len[i][a];
a=f[i][a];
}
}
//cout<<a<<" "<<b<<endl;
//cout<<ans<<endl;
if(a==b) return ans;
//cout<<ans<<endl;
//s=ceil(log(dep[x])/log(2));
for(int i=19;i>=0;i--)
{
if(f[i][a]!=f[i][b])
{
ans+=len[i][a];
a=f[i][a];
ans+=len[i][b];
b=f[i][b];
}
}
return ans+len[0][a]+len[0][b];
}
int main()
{
int n,m;
memset(fa,0,sizeof(fa));
memset(depth,0,sizeof(depth));
scanf("%d",&n);
for(int i=1;i<n;i++)
{
int u,v,len;
scanf("%d %d %d",&u,&v,&len);
//cout<<u<<" "<<v<<" "<<len<<endl;
edge[u].push_back(mp(v,len));
//cout<<u<<" "<<v<<endl;
edge[v].push_back(mp(u,len));
//cout<<u<<" "<<v<<endl;
}
dfs(1);//因为是无根树,所以可以任取一个节点,作为根
//for(int i=1;i<=n;i++) cout<<depth[i]<<endl;
//for(int j=1;j<=n;j++) cout<<len[1][j]<<endl;
/*for(int i=19;(1<<i)<=depth[j];i--)
{
cout<<len[i][j]<<endl;
}*/
scanf("%d",&m);
for(int i=0;i<m;i++)
{
int u,v;
scanf("%d %d",&u,&v);
int ans=ST(u,v);
printf("%d\n",ans);
}
return 0;
}
题目连接:http://codevs.cn/problem/2370/
ST和LCA和无根树连接的更多相关文章
- ST&倍增LCA
回顾st算法,它的一大功能是求区间最值.先将整个区间划分成若干个小的区间,求出最值,然后将小的区间合并成一个大的区间,我们这里要用到一个数组minn[i][j],划重点!如果我们要求的是区间最小值,m ...
- 51Nod1766 树上的最远点对 ST表 LCA 线段树
原文链接https://www.cnblogs.com/zhouzhendong/p/51Nod1766.html 题目传送门 - 51Nod1766 题意 n个点被n-1条边连接成了一颗树,给出a~ ...
- hdu 2874 Connections between cities(st&rmq LCA)
Connections between cities Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (J ...
- 倍增小结 ST 与 LCA
倍增 倍增我是真滴不会 倍增法(英语:binary lifting),顾名思义就是翻倍. 能够使线性的处理转化为对数级的处理,大大地优化时间复杂度. (ps:上次学倍增LCA,没学会,老老实实为了严格 ...
- st表 LCA
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把 ...
- LCA统计
读入挂 inline void read(int &v) { v = ; ; ; ') { if (c == '-') { p = -; } c = getchar(); } ') { v = ...
- 关系数据库SQL之高级数据查询:去重复、组合查询、连接查询、虚拟表
前言 接上一篇关系数据库SQL之基本数据查询:子查询.分组查询.模糊查询,主要是关系型数据库基本数据查询.包括子查询.分组查询.聚合函数查询.模糊查询,本文是介绍一下关系型数据库几种高级数据查询SQL ...
- HDU 3078 (LCA+树链第K大)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=3078 题目大意:定点修改.查询树中任意一条树链上,第K大值. 解题思路: 先用离线Tarjan把每个 ...
- 使用JDBC连接操作数据库
JDBC简介 Java数据库连接(Java Database Connectivity,JDBC),是一种用于执行SQL语句的Java API,它由一组用Java编程语言编写的类和接口组成. JDBC ...
随机推荐
- Windows7 安装ubuntu双系统
家里的老笔记本是MBR分区,不支持EFI , 一开始是用U盘安装的,还对着ubuntu官网的教程,下载了官方推荐的那个u盘引导工具,安装依然会报错, 网上查询也有很多种说法,也有说是bug的,无论如何 ...
- 洛谷1005 【NOIP2007】矩阵取数游戏
问题描述 帅帅经常跟同学玩一个矩阵取数游戏:对于一个给定的n*m的矩阵,矩阵中的每个元素aij均为非负整数.游戏规则如下: 1.每次取数时须从每行各取走一个元素,共n个.m次后取完矩阵所有元素: 2. ...
- Java Web Application——servlet
概述 是一个部署于web服务器中的实现了servlet接口的Java类,用于响应web请求 Web容器(也称为servlet容器)本质上是与servlet交互的Web服务器的组件.Web容器负责管理s ...
- caioj 1412 动态规划3:a+b问题(完全背包方案数)
每个素数就是一个物品,然后就相当于求完全背包方案数 把max改成+就好了. #include<cstdio> #include<vector> #include<cstr ...
- [SDOI2011]消防(树的直径)
[SDOI2011]消防 题目描述 某个国家有n个城市,这n个城市中任意两个都连通且有唯一一条路径,每条连通两个城市的道路的长度为zi(zi<=1000). 这个国家的人对火焰有超越宇宙的热情, ...
- ArcGIS api for javascript——用缓存区查询地图
描述 本例展示了如何在另外一个任务里使用一个任务的结果.单击地图查看被单击的点的1公里范围内的缓存(如果需要可以修改这个默认的缓存距离).也可以看缓存区的这些点的人口普查街区信息.单击一个点查看更多的 ...
- bzoj2843极地旅行社题解
题目大意 有n座小岛,当中每一个岛都有若干帝企鹅. 一開始岛与岛之间互不相连.有m个操作.各自是在两个岛之间修一座双向桥,若两岛已连通则不修并输出no,若不连通就输出yes并修建.改动一个岛上帝企鹅的 ...
- Eclipse快捷键 10个最实用的快捷键
Eclipse中10个最实用的快捷键组合 一个Eclipse骨灰级开发人员总结了他觉得最实用但又不太为人所知的快捷键组合.通过这些组合能够更加easy的浏览源代码.使得总体的开发效率和质量得到提升. ...
- AFNetworking框架的使用
#import "ViewController.h" #import "AFNetworking.h" @interface ViewController () ...
- session和cookie详解
摘要:虽然session机制在web应用程序中被采用已经很长时间了,但是仍然有很多人不清楚session机制的本质,以至不能正确的应用这一 技术.本文将详细讨论session的工作机制并且对在Java ...