nowcoder 寻找(LCA)】的更多相关文章

这个题貌似是过的最少的? smeow一眼给出了一个单log的算法orz 首先求出x和y的lca, x和c的lca,y和c的lca, 然后分类讨论以下就行了 实际上只有三种情况 #include<cstdio> #include<algorithm> #include<cstring> #include<queue> #include<iostream> #define ll long long #define M 100010 #define m…
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 算法分析:显然任意两个城市之间的路径是唯一的,商人有方向地从起点移动到终点.询问这条路径上任意两点权值之差最大为多少,且要保证权值较大的节点在路径上位于权值较小的节点之后. 暴力的方法是显而易见的,只要找到两个点的深度最深的公共祖先,就等于找到了这条路径,之后沿着路径走一遍即可找到最大的利润,然而无法满足50…
qwq 预处理出从$x$节点向上跳2i个节点的序号$p[x][i]$及节点深度$dpth[x]$, 寻找$lca$时,从$Max$(可能的最大深度)到0枚举$i$, 首先把较深的一个节点向上跳至深度相同, 然后两个点同步动作,若$p[x][i]≠p[y][i]$则跳. 最终返回他们的父亲$p[x][0]$即为$lca$. 注意双向边要开2倍 #include<cstdio> #include<iostream> #include<cmath> #define MogeK…
第一种:树上倍增 f[x,k]表示x的2^k辈祖先,即x向根结点走2^k步达到的结点. 初始条件:f[x][0]=fa[x] 递推式:f[x][k]=f[ f[x][k-1] ][k-1] 一次bfs预处理f数组(nlogn),然后每次询问都可以在(logn)时间内求出x,y的lca 求lca的步骤 1.令x的深度大于y,然后通过二进制拆分将x上调到与y同一个深度(依次用k=2^logn,...2^1,2^0试探) 2.如果此时x==y,那么y=lca(x,y),算法结束 3.继续用第一步的二进…
题目链接:http://poj.org/problem?id=1470 题意是给出一颗树,q个查询,每个查询都是求出u和v的LCA:    以下是寻找LCA的预处理过程: void LCA(u){ for(u的每个儿子v) { LCA(v); union(u,v);//并到一个集合中去 } visit[u]=; for(查询中u的每个儿子v) { if(visit[v]) u,v的最近公共祖先是father[getfather(v)]; } } 详细解释   图文详解  本题可以使用预处理的方式…
题目链接: How far away ? Time Limit: 2000/1000 MS (Java/Others)     Memory Limit: 32768/32768 K (Java/Others) Problem Description   There are n houses in the village and some bidirectional roads connecting them. Every day peole always like to ask like th…
There are N cities in a country, and there is one and only one simple path between each pair of cities. A merchant has chosen some paths and wants to earn as much money as possible in each path. When he move along a path, he can choose one city to bu…
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 算法分析:显然任意两个城市之间的路径是唯一的,商人有方向地从起点移动到终点.询问这条路径上任意两点权值之差最大为多少,且要保证权值较大的节点在路径上位于权值较小的节点之后. 暴力的方法是显而易见的,只要找到两个点的深度最深的公共祖先,就等于找到了这条路径,之后沿着路径走一遍即可找到最大的利润,然而无法满足50…
Luogu P3379 题意:对于两个节点,寻找他们的最近公共祖先. 一个显而易见的解法是对于每一个节点我们都往上遍历一遍,记录下它每一个祖先,然后再从另一个节点出发,一步一步往上走,找到以前记录过第一个节点就是这两个节点的LCA 事实上在这样的数据规模下,这种解法的时间复杂度是让人无法接受的. 很容易发现,这样的解法慢在两个节点是一步一步往上走的,也许可以想个办法一次跳一大步? 于是我们引入了倍增法求LCA. 我们知道,对于任意一个整数数,都可以使用\(2^k+2^{k-1}+...+2^0\…
题意:根据前序和中序建立树,寻找两个点的LCA. 我在之前的博客中写了关于LCA的多种求法. https://www.cnblogs.com/yy-1046741080/p/11505547.html.  在建树的过程中,建立深度和parent,来寻找LCA. 该题目的数据有一定的欺诈性,它给你结点数据是1-8,如果没有仔细看清题目,那么很有可能定义一个 node tree[10005]的数组,但是题目并没有说数据范围在1-10000内. 经过测试,如果你将范围定义稍微大一点,还是能全过的: 我…
The merchant Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 6864   Accepted: 2375 Description There are N cities in a country, and there is one and only one simple path between each pair of cities. A merchant has chosen some paths and w…
https://leetcode.com/submissions/detail/32662938/ Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between t…
3.货车运输 (truck.cpp/c/pas) [问题描述] A 国有 n 座城市,编号从 1 到 n,城市之间有 m 条双向道路.每一条道路对车辆都有重量限制,简称限重.现在有 q 辆货车在运输货物,司机们想知道每辆车在不超过车辆限重的情况下,最多能运多重的货物. [输入] 输入文件名为 truck.in. 输入文件第一行有两个用一个空格隔开的整数 n,m,表示 A 国有 n 座城市和 m 条道路. 接下来 m 行每行 3 个整数 x.y.z,每两个整数之间用一个空格隔开,表示从 x 号城市…
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4687 题意:给一个无向图,求所有的最大匹配的情况所不包含的边.. 数据比较小,直接枚举边.先求一次最大匹配hig,然后依次枚举所有边,假设此边为一个匹配,那么删掉边的两个节点,然后再剩下的图中求最大匹配t,如果t<hig-1那么就是不包含的边了.关于一般图上的最大匹配算法,O(n^3)的Edmonds's matching algorithm,理解起来比较容易,但是写起来比较麻烦,收集了一个模板,b…
看了两篇博客,觉得写得不错,便收藏之.. 首先是第一篇,转自某Final牛 带花树……其实这个算法很容易理解,但是实现起来非常奇葩(至少对我而言). 除了wiki和amber的程序我找到的资料看着都不大靠谱 比如昨晚找到一篇鄙视带花树的论文,然后介绍了一种O(E)的一般图最大匹配……我以为找到了神论文,然后ACM_DIY众神纷纷表示这个是错的……于是神论文成为了”神论文“…… 又比如围观nocow上带花树标程,一看……这显然是裸的匈牙利算法……货不对板啊 当然……如果二分图的匈牙利算法还不会请先…
leetcode面试准备:Lowest Common Ancestor of a Binary Search Tree & Binary Tree 1 题目 Binary Search Tree的LCA Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikiped…
传送门:https://acm.ecnu.edu.cn/contest/105/problem/Q/ 一棵树,支持两种操作:给一条路径上的节点加上一个等差数列;求两点路径上节点和. 很明显,熟练剖分.用线段树维护链上的区间和,每个节点中记录等差数列的首项,公差和区间和.因为两个等差数列叠加之后还是等差数列,所以将首项与公差视作懒惰标记. 因为在寻找LCA的过程中,u往上跳的时候,其实是要维护递减的等差数列(dfs序是u->topu递减,而数列是u->topu递增);v往上跳的时候,是递增的.计…
题意:树上每个结点有自己的颜色,支持两种操作:1.将u到v路径上的点颜色修改为c; 2.求u到v路径上有多少段不同的颜色. 分析:树剖之后用线段树维护区间颜色段数.区间查询区间修改.线段树结点中维护的有:段数,左端点颜色,右端点颜色和懒惰标记. 当区间合并时,若左孩子的右端点颜色和右孩子的左端点颜色相同,那么段数要减1. 区间修改时注意维护左右端点的颜色. 查询时若左右子区间连接处的颜色相同,段数减1. 在两点向一条链上寻找LCA时,每次查询都要保存该条链顶端的颜色,若该链顶端的颜色与下次查询的…
1262. [NOIP2012] Vigenère 密码 ★   输入文件:vigenere.in   输出文件:vigenere.out   简单对比时间限制:1 s   内存限制:128 MB [题目描述] 16 世纪法国外交家Blaise de Vigenère设计了一种多表密码加密算法——Vigenère密码.Vigenère 密码的加密解密算法简单易用,且破译难度比较高,曾在美国南北战争中为南军所广泛使用. 在密码学中,我们称需要加密的信息为明文,用 M 表示:称加密后的信息为密文,用…
洛谷 P3038 [USACO11DEC]牧草种植Grass Planting 洛谷传送门 JDOJ 2282: USACO 2011 Dec Gold 3.Grass Planting JDOJ传送门 Description Problem 3: Grass Planting [Travis Hance, 2011] Farmer John has N barren pastures (2 <= N <= 100,000) connected by N-1 bidirectional roa…
Given a binary search tree (BST), find the lowest common ancestor (LCA) of two given nodes in the BST. According to the definition of LCA on Wikipedia: “The lowest common ancestor is defined between two nodes p and q as the lowest node in T that has…
这道题其实也非常简单,只是在求割边及其个数的情况下,每次往里面加入新的边,并再次计算割边的个数. 我们用tarjan可以求出原图的桥以及个数,当然我们不能暴力加边,然后求解,那么如何求呢??? 其实非常简单,我们可以LCA进行求解,我们在a和b点两个点之间加入新的边,那么相当于连通了a,b,那么原来a,b以及其LCA上的桥,变成不是桥了,为什么???很简单 我加入这条新的边以后,那么从这两个点,到LCA组成了一个环,我们知道环上面的线一定不是桥,所以我们,可以通过寻找LCA,计算出我们减少的桥.…
目录 T1 小奇取石子 题目 考场思路 正解 T2 「CCO 2017」专业网络 题目 考场思路 题解 T3 「ZJOI2017」线段树 题目 考场思路 正解 这场考试感觉很奇怪. \(T1.T2\) 都缺一个小特判. \(T3\) 打了个比暴力优的暴力 还是暴力,但是不知道为什么 \(WA\) 穿了. 考试的时候还玩扫雷... 其实,菜是原罪啊... ___ T1 小奇取石子 题目 点这里 考场思路 刚开始差点被自己坑了,开考 \(5min\) 就码出了一个可以惨痛爆零的 \(01\) 背包.…
链接:https://ac.nowcoder.com/acm/contest/558/D来源:牛客网 寻找 小猫在研究树. 小猫在研究树上的距离. 给定一棵N个点的树,每条边边权为1. Q次询问,每次给定a,b,c,请你输出a到b的路径上离c最近的点的编号. 输入描述: 第一行一个正整数N,表示节点数量. 接下来N−1行,第i行两个正整数ui,vi,表示第i条边连接节点ui,vi. 接下来一行一个正整数Q,表示询问数量. 接下来Q行,每行三个正整数a,b,c,表示一组询问. 输出描述: Q行,每…
看懂题目意思.他的意思是求将全部的城市走一遍,危急度最小.而且给 你两个s,t后让你求在走的时候,从s到t过程中危急度最大的值,并输出它, 然后就是怎样攻克了,这个题目能够说简单,也能够说难 通过思考能够知道s到t的路径进行遍历就是所谓的答案了 所以通过LCA算法就能够解决这个问题,大家能够去看看LCA在图论上的算法 /* Author: 2486 Memory: 0 KB Time: 2222 MS Language: C++11 4.8.2 Result: Accepted VJ RunId…
转自 剑指Offer之 - 树中两个结点的最低公共祖先 题目: 求树中两个节点的最低公共祖先. 思路一: ——如果是二叉树,而且是二叉搜索树,那么是可以找到公共节点的. 二叉搜索树都是排序过的,位于左子树的节点都比父节点小,而位于右子树上面的节点都比父节点大. 如果当前节点的值比两个结点 的值都大,那么最低的共同的父节点一定是在当前节点的左子树中,于是下一步遍历当前节点的左子节点. 如果当前节点的值比两个结点的值都小,那么最低的共同的父节点一定是在当前节点的右子树中,于是下一步遍历当前节点的右子…
转载自:Click Here LCA问题(Lowest Common Ancestors,最近公共祖先问题),是指给定一棵有根树T,给出若干个查询LCA(u, v)(通常查询数量较大),每次求树T中两个顶点u和v的最近公共祖先,即找一个节点,同时是u和v的祖先,并且深度尽可能大(尽可能远离树根).LCA问题有很多解法:线段树.Tarjan算法.跳表.RMQ与LCA互相转化等.本文主要讲解Tarjan算法的原理及详细实现. 一 LCA问题 LCA问题的一般形式:给定一棵有根树,给出若干个查询,每个…
最近公共祖先问题(LCA)是求一颗树上的某两点距离他们最近的公共祖先节点,由于树的特性,树上两点之间路径是唯一的,所以对于很多处理关于树的路径问题的时候为了得知树两点的间的路径,LCA是几乎最有效的解法. 首先是LCA的倍增算法.算法主体是依靠首先对整个树的预处理DFS,用来预处理出每个点的直接父节点,同时可以处理出每个点的深度和与根节点的距离,然后利用类似RMQ的思想处理出每个点的 2 的幂次的祖先节点,这就可以用 nlogn 的时间完成整个预处理的工作.然后每一次求两个点的LCA时只要对两个…
1,什么是LCA LCA.最近公共祖先.是一个在解决树上问题最强劲有力的一个工具.一般都是指.在一棵树上取两个节点a,b .另一个节点x它满足  x是a与b的祖先而且x深度最大.这个x就是节点a,b的最近公共祖先. 2,什么是树上倍增. 树上倍增.其实就是通过二进制拆分.将规则一定情况下加速区间状态转移,的一种奇技淫巧.实质是根据已经得到的信息,将考虑的范围扩大一倍,从而加速操作的思想.       其实就是预处理出一个表.每次通过翻倍区间去查询. >往下看<可能会更清楚.毕竟实践是检验真理的…
Tarjan算法的详细介绍,请戳: http://www.cnblogs.com/chenxiwenruo/p/3529533.html #include <iostream> #include <stdio.h> #include <string.h> #include <algorithm> #include <string> #include <vector> /* AC 一开始读取数据的方式并不好,运行900多ms. 后来参照…