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,且只能购买并出售一次商品,问最多可以产生多大的利润. ...
随机推荐
- paramiko模块-2
如何用paramiko模块模拟登入服务器,并记录操作日志,起到审计的作用? 各个client ---(连接跳转机)--->(跳转机)------>各自的目标服务器. 目前我们公司的跳转机, ...
- 删除表空间的时候遇到的问题:ORA-02429: 无法删除用于强制唯一/主键的索引
今天打算删除orcale数据库中无用的表空间,发现报错,查资料删除,写个过程留着备用.1.drop tablespace dldata INCLUDING CONTENTS CASCADE CONST ...
- [原创.数据可视化系列之六]使用openlyaers进行公网地图剪切
进行地图开发的过程中,我一般使用天地图或者微软的地图作为地图,因为这两种地图的经纬度偏差最小,基本可以满足用户需求,比如: 不用说,都是全部地图,这也是最常用的一种方法. 但是用户说,我只看大连的地图 ...
- js中的原形链问题
---恢复内容开始--- 一.在js中大家讨论的原形链都是围绕在prototype和__proto__. 1.__proto__是内部原型 2.prototype是构造器原型(构造器就是构造函数) 3 ...
- Android Dex文件格式(二)
第三块: 数据区 索引区中的最终数据偏移以及文件头中描述的map_off偏移都指向数据区, 还包括了即将要解析的class_def_item, 这个结构非常重要,下面就开始解析 c ...
- c++学习笔记01-输入输出流&&文件输入输出操作
const int size=50等于#define size 50 字符串默认以0结尾: 一.输入输出流 cin.get()会从输入中取走一个字符: cin.peek()会从输入中检测第一个字符: ...
- git 创建远程分支和删除 master 分支
. . . . . 最近需要将不同的客户的代码分开管理,所以需要为这些代码分别创建分支. 目前版本库中分支结构如下: [yuhuashi@local:Project]$ git branch -a* ...
- web开发工具软件使用问题记录
一.右键 - 添加Git Bash Here菜单 转自:http://blog.csdn.net/u014527912/article/details/51723735 步骤: 1.通过在“运行”中输 ...
- 《锋利的jQuery》(第2版)读书笔记4
第9章 jQuery Mobile jQuery Mobile是用来填补jQuery在移动设备应用上的缺憾的一个新项目. 它基于jQuery框架并使用HTML5和CSS3这些新的技术,除了能提供很多基 ...
- for xml 字符串拼接
SELECT TOP 10 B.user_gid,LEFT(StuList,LEN(StuList)-1) as hobby FROM (SELECT user_gid,( SELECT CAST(a ...