poj3728
【描述】
有 N 城 市在一个国家,有一个且只有一个简单的路径每一对城市之间。 一个商人选择了一些路径和想赚尽可能多的钱在每个路径。 当他沿着一条路径,可以选择一个城市购买一些商品和出售他们在一个城市。 货物在所有的城市都是一样的,但价格是不同的。 现在你的任务是计算每条路径的最大利润。
【解】
这是一道树上的题目,找路径自然不必多说lca找到公共祖先路径也就找到了。但是这个题有个细节,就是要先买入后卖出,所以不能返回,也就是说价格低的要比价格高的在前面经过。最先想到的是dfs找答案,但很明显会TLE,因为Q和N太大了。所以就要想到优化了,得到公共祖先之后答案存在的范围有三种,第一种:答案在起点到公共祖先之间(最大值和最小值都在一边),第二种:答案在公共祖先和重点之间(同前),第三种:答案在两者之前(最小值在起点到公共祖先之间,最大值在公共最先到终点之间)。
一开始是想的在dfs上进行优化,设vis[i]标记i是否被询问过,rt[i]最近的关于点i的询问中i的祖先,minp[i]为i到rt[i]之间的最小价格,maxp[i]为i到rt[i]之间的最大价格,up[i]为从i到rt[i]之间的可赚取的最大收益,down[i]为从rt[i]到i之间的最大收益。然后按照公共祖先的顺序从大到小排列,边搜索边更新数组这样就相当于记忆化搜索,可以减少搜索时间。但我们发现,这些其实是可以通过倍增思想求得的。也就是说可以省掉rt数组和vis数组,minp[i][j]代表i向上跳j步的最小价格,maxp[i][j]代表i向上跳j步的最大价格,up[i][j]为i向上跳j步可赚取的最大收益,down[i][j]为公共祖先向下跳j步的最大收益。可以像如下更新数组
int ask_ans(int u,int p,int v)
{
int upmax=0,downmax=0,minu=1<<30,maxv=0;
for(int i=21;i>=0;i--)
if(dep[u]-(1<<i)>=dep[p])
{
upmax=max(maxp[u][i]-minu,max(up[u][i],upmax));//特别注意和下一句的顺序不能颠倒,取这段的最大值up[u][i]和这段和上一段的最大值maxp[u][i]-minu和现在得到的最大值对比
minu=min(minu,minp[u][i]);
u=f[u][i];
}
for(int i=21;i>=0;i--)
if(dep[v]-(1<<i)>=dep[p])
{
downmax=max(maxv-minp[v][i],max(down[v][i],downmax));
maxv=max(maxv,maxp[v][i]);
v=f[v][i];
}
return max(0,max((maxv-minu),max(upmax,downmax)));
}
poj3728的更多相关文章
- POJ3728 LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
- poj3728 商务旅行
[Description]小 T 要经常进行商务旅行,他所在的国家有 N 个城镇,标号为 1,2,3,...,N,这 N 个城镇构成一棵树.每个城镇可以买入和卖出货物,同一城镇买入和卖出的价格一样,小 ...
- poj3728 倍增法lca 好题!
lca的好题!网上用st表和离线解的比较多,用树上倍增也是可以做的 不知道错在哪里,等刷完了这个专题再回来看 题解链接https://blog.csdn.net/Sd_Invol/article/de ...
- [POJ3728]The merchant
题目大意: 给你一棵n个结点的带权树,有q组询问,问你从u到v的路径上最大值与最小值的差(最大值在最小值后面). 思路: 首先考虑路径上合并两个子路径u->t和t->v时的情况. 假设我们 ...
- 集训day15 t1 poj3728
[问题描述] 有一颗n个节点的树 每个节点上都有许多奸商在卖东西,第i个奸商的理想价格为vi,即他会以vi的价格购买或卖出一件东西 有m个人希望从树上的某个点走到另一个点,问你在只进行一次买卖(每次仅 ...
- poj3728之离线LCA+dp思想/RMQ+LCA(非常好的题目)
题意很简单 给一个树(n < 5w) 每个点有个权值,代表商品价格 若干个询问(5w) 对每个询问,问的是从u点走到v点(简单路径),商人在这个路径中的某点买入商品,然后在某点再卖出商品, ...
- poj3728(lca / tarjan离线)
题目链接: http://poj.org/problem?id=3728 题意: 给出一棵带点权值的树, 对于 q 组形如 x, y 的询问, 一个人要从 x 到 y(单向), 他可以在路上任意一点以 ...
- [POJ3728]The merchant(tanrjan_lca + DP)
传送门 比着题解写还错... 查了两个小时没查出来,心态爆炸啊 以后再查 ——代码(WA) #include <cstdio> #include <cstring> #incl ...
- POJ3728 THE MERCHANT LCA RMQ DP
题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
随机推荐
- CSS3新增属性
1>RGBA透明度(红.绿.蓝.alpha透明度) 2>块阴影 box-shadow(标签).text-shadow(文字) 3>圆角阴影 border-radius 4>边框 ...
- sqllite
public static void tt() { int ID = 0; while(true) { stri ...
- '++' needs l-value
碰到这样一段代码:char c[]= "abc";while(*c){printf("%c",*c);c++;} 错误定位到 c++ ; 这一行,提示: ' ...
- 通过反射绑定事件_Office Visio
花了好几个小时才Try出来,记录一下: //反射获取Visio.Application,此处没有判断是否有安装Visio mVisioType = System.Type.Get ...
- jQuery学习笔记(一)
1.什么是jQuery? jQuery是一个JavaScript函数库. jQuery是一个轻量级的"写的少,做的多"的JavaScript库. 2.为什么要使用jQuery? 目 ...
- 郑捷《机器学习算法原理与编程实践》学习笔记(第四章 推荐系统原理)(二)kmeans
(上接第二章) 4.3.1 KMeans 算法流程 算法的过程如下: (1)从N个数据文档随机选取K个文档作为质心 (2)对剩余的每个文档测量其到每个质心的距离,并把它归到最近的质心的类 (3)重新计 ...
- java 缓冲
缓存主要可分为二大类: 一.通过文件缓存,顾名思义文件缓存是指把数据存储在磁盘上,不管你是以XML格式,序列化文件DAT格式还是其它文件格式: 二.内存缓存,也就是实现一个类中静态Map,对这个Map ...
- sqlalchemy 大全
SQLAchemy SQLAlchemy是Python编程语言下的一款ORM框架,该框架建立在数据库API之上,使用关系对象映射进行数据库操作,简言之便是:将对象转换成SQL,然后使用数据API执行S ...
- ww
#!bin/python #coding=utf-8 """ Create by he """ import sys import re i ...
- 使用re-sign.jar对apk进行重签名
准备: ① re-sign.jar重签名工具:(下载地址为:http://troido.de/downloads/category/1): ② 待重签名的apk: 重签名步骤: ① 右键re ...