【描述】

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的更多相关文章

  1. POJ3728 LCA RMQ DP

    题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...

  2. poj3728 商务旅行

    [Description]小 T 要经常进行商务旅行,他所在的国家有 N 个城镇,标号为 1,2,3,...,N,这 N 个城镇构成一棵树.每个城镇可以买入和卖出货物,同一城镇买入和卖出的价格一样,小 ...

  3. poj3728 倍增法lca 好题!

    lca的好题!网上用st表和离线解的比较多,用树上倍增也是可以做的 不知道错在哪里,等刷完了这个专题再回来看 题解链接https://blog.csdn.net/Sd_Invol/article/de ...

  4. [POJ3728]The merchant

    题目大意: 给你一棵n个结点的带权树,有q组询问,问你从u到v的路径上最大值与最小值的差(最大值在最小值后面). 思路: 首先考虑路径上合并两个子路径u->t和t->v时的情况. 假设我们 ...

  5. 集训day15 t1 poj3728

    [问题描述] 有一颗n个节点的树 每个节点上都有许多奸商在卖东西,第i个奸商的理想价格为vi,即他会以vi的价格购买或卖出一件东西 有m个人希望从树上的某个点走到另一个点,问你在只进行一次买卖(每次仅 ...

  6. poj3728之离线LCA+dp思想/RMQ+LCA(非常好的题目)

    题意很简单 给一个树(n < 5w) 每个点有个权值,代表商品价格 若干个询问(5w) 对每个询问,问的是从u点走到v点(简单路径),商人在这个路径中的某点买入商品,然后在某点再卖出商品,   ...

  7. poj3728(lca / tarjan离线)

    题目链接: http://poj.org/problem?id=3728 题意: 给出一棵带点权值的树, 对于 q 组形如 x, y 的询问, 一个人要从 x 到 y(单向), 他可以在路上任意一点以 ...

  8. [POJ3728]The merchant(tanrjan_lca + DP)

    传送门 比着题解写还错... 查了两个小时没查出来,心态爆炸啊 以后再查 ——代码(WA) #include <cstdio> #include <cstring> #incl ...

  9. POJ3728 THE MERCHANT LCA RMQ DP

    题意简述:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格.商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润. ...

随机推荐

  1. CSS解决高度自适应问题

    HTML结构如下: <div id="main">     <div id="top">top</div>     < ...

  2. 使用Word发布文章到 WordPress 博客

    使用Word发布文章到 WordPress 博客 我们都知道,WordPress 自带的编辑器功能比较弱,而使用 Word 编辑文档却功能强大.其实我们使用 Word 编辑好的文档也是可以直接发布到 ...

  3. 【C#】项目优化实战

    [C#]项目优化实战 一. 数据库设计 1. 常量的枚举值直接存中文不要存数字(注意是常量,如果显示值可变就不能) 例如:男女,在数据库中不要存1和0,直接存男和女. 这样的好处:读取数据的时候可以避 ...

  4. awk 统计出现次数--转

    知识点: 1)数组 数组是用来存储一系列值的变量,可通过索引来访问数组的值. Awk中数组称为关联数组,因为它的下标(索引)可以是数字也可以是字符串. 下标通常称为键,数组元素的键和值存储在Awk程序 ...

  5. shll 变量

    name=zhagnsan age=11 echo $ name $age 赋值号两边没有任何空格.当想取shell变量的值时,需要在变量名前加上$字符,当所赋的值中间含有空格时,要加上引号 函数: ...

  6. 通过RGB灯输出七色

    本文由博主原创,如有不对之处请指明,转载请说明出处. /********************************* 代码功能:输出模拟信号,控制RGB灯的颜色 使用函数: pinMode(引脚 ...

  7. iOS网络请求之multipart/form-data提交数据

    multipart/form-data表单数据 在http网络请求中,post没有请求长度的限制,因为post把数据放在了body中,而不是像Get一样放在了浏览器的地址栏中(可以这么理解), 所以相 ...

  8. grep使用多个查询条件--或

    [root@mail ~]# grep 'usrquota\|grpquota' /etc/fstabLABEL=/1                /                       e ...

  9. 为什么重写equals时必须重写hashCode方法?

    原文地址:http://www.cnblogs.com/shenliang123/archive/2012/04/16/2452206.html 首先我们先来看下String类的源码:可以发现Stri ...

  10. erlang,elixir安装

    erlang下载地址:https://packages.erlang-solutions.com/erlang/ elixir(precompile版)下载地址:https://github.com/ ...