poj3728】的更多相关文章

[描述] 有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间. 一个商人选择了一些路径和想赚尽可能多的钱在每个路径. 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市. 货物在所有的城市都是一样的,但价格是不同的. 现在你的任务是计算每条路径的最大利润. [解] 这是一道树上的题目,找路径自然不必多说lca找到公共祖先路径也就找到了.但是这个题有个细节,就是要先买入后卖出,所以不能返回,也就是说价格低的要比价格高的在前面经过.最先想到的是dfs找答案,但很明显会…
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 算法分析:显然任意两个城市之间的路径是唯一的,商人有方向地从起点移动到终点.询问这条路径上任意两点权值之差最大为多少,且要保证权值较大的节点在路径上位于权值较小的节点之后. 暴力的方法是显而易见的,只要找到两个点的深度最深的公共祖先,就等于找到了这条路径,之后沿着路径走一遍即可找到最大的利润,然而无法满足50…
[Description]小 T 要经常进行商务旅行,他所在的国家有 N 个城镇,标号为 1,2,3,...,N,这 N 个城镇构成一棵树.每个城镇可以买入和卖出货物,同一城镇买入和卖出的价格一样,小 T 想从 a走到 b,在这过程中,在某个城镇买入一个货物,然后在一个城镇卖出,可以是同一城镇买入和卖出,使得收益最大,注意不能走回头路.[Input]第一行一个数 N,第二行 N 个数,第 i 个数表示城镇 i 买入和卖出货物的价格.接下来 N – 1 行,每行两个数 a,b,表示 a 到 b 之…
lca的好题!网上用st表和离线解的比较多,用树上倍增也是可以做的 不知道错在哪里,等刷完了这个专题再回来看 题解链接https://blog.csdn.net/Sd_Invol/article/details/9572423 /* 给一颗点权树,求出一个点对(x,y)之间的max{A,B,C} A:x到lca路径上的最大差值 B:lca到y路径上的最大差值 C:x到y路径上的最大差值 需要维护的值,x结点到的祖先,x结点到祖先路径上的最大值,最小值,x结点到路径上的最大收益,最小收益(可以是负…
题目大意: 给你一棵n个结点的带权树,有q组询问,问你从u到v的路径上最大值与最小值的差(最大值在最小值后面). 思路: 首先考虑路径上合并两个子路径u->t和t->v时的情况. 假设我们已经知道了两个路径的最大值max,最小值min,以及路径上最大值与最小值的差d(最大值在最小值后面), 那么我们最大值和最小值可以直接合并,d=max(d1,d2,max2-max1). 现在我们用倍增或者树链剖分维护这些东西,再跑一跑LCA即可. 然而我们发现往上跑和往下跑是不一样的,所以我们要维护两种差值…
[问题描述] 有一颗n个节点的树 每个节点上都有许多奸商在卖东西,第i个奸商的理想价格为vi,即他会以vi的价格购买或卖出一件东西 有m个人希望从树上的某个点走到另一个点,问你在只进行一次买卖(每次仅限一个商品)的情况下,每个人最多能赚多少钱 [输入] 输入第一行是一个整数 n,表示树上的点数. 接下来n个正整数,表示每个奸商的理想价格. 接下来n-1行,每行两个整数x,y,表示第x点和第y点有一条边. 接下来一个整数m,表示下来有m个询问. 接下来有m行,每行两个整数x和y,表示某个人要从第x…
题意很简单 给一个树(n < 5w) 每个点有个权值,代表商品价格 若干个询问(5w) 对每个询问,问的是从u点走到v点(简单路径),商人在这个路径中的某点买入商品,然后在某点再卖出商品,   最大可能是多少 注意一条路径上只能买卖一次,先买才能卖 *分析:先求出点u,v的最近公共祖先f,然后求u->f->v的利润最大值maxval   对于这个maxval可能有三种情况:   1:maxval是u->f的maxval   2:maxval是f->v的maxval   3:m…
题目链接: http://poj.org/problem?id=3728 题意: 给出一棵带点权值的树, 对于 q 组形如 x, y 的询问, 一个人要从 x 到 y(单向), 他可以在路上任意一点以此点的的权值买一件物品, 并在接下来的路程中任意一点将其以该点的权值卖出, 输出其最大收益, 若不能获益则输出 0 . 思路: 若不考虑时间复杂度的话对于询问 x, y. 可以先求出 lca(x, y), 然后再 x -> lca -> y 路径上求一下最大收益即可. 然而这样会 tle. 可以考…
传送门 比着题解写还错... 查了两个小时没查出来,心态爆炸啊 以后再查 ——代码(WA) #include <cstdio> #include <cstring> #include <iostream> #define N 2000001 #define Min(x, y) ((x) < (y) ? (x) : (y)) #define Max(x, y) ((x) > (y) ? (x) : (y)) #define swap(x, y) ((x) ^=…
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. 算法分析:显然任意两个城市之间的路径是唯一的,商人有方向地从起点移动到终点.询问这条路径上任意两点权值之差最大为多少,且要保证权值较大的节点在路径上位于权值较小的节点之后. 暴力的方法是显而易见的,只要找到两个点的深度最深的公共祖先,就等于找到了这条路径,之后沿着路径走一遍即可找到最大的利润,然而无法满足50…