【描述】

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. 【英语魔法俱乐部——读书笔记】 1 初级句型-简单句(Simple Sentences)

    第一部分 1 初级句型-简单句(Simple Sentences):(1.1)基本句型&补语.(1.2)名词短语&冠词.(1.3)动词时态.(1.4)不定式短语.(1.5)动名词.(1 ...

  2. navicat 连接oracle 出现ora06413 连接未打开

    问题原因:未选择OCI执行DLL,和windows 64位的(x86)无关 解决方法:navicat中 工具->选项->OCI中的OCI library选择路径(navimat安装路径)C ...

  3. 个人关于React的一些理解

    ##React背景 React是当前前端最火的框架,它的理念思想及构建方法比AngularJS更适合做webApp. 它是由facebook团队研发并开源到社区,所以它有很强大的技术背景,而且它的架构 ...

  4. HRS(CRLF Injection)

    [HRS(CRLF Injection)] CRLF是”回车 + 换行”(\r\n)的简称.在HTTP协议中,HTTP Header与HTTP Body是用两个CRLF分隔的,浏览器就是根据这两个CR ...

  5. LinckedhashMap原理

    http://zhangshixi.iteye.com/blog/673789 TreeMap的key是有顺序的,是自然顺序,也可以指定比较函数. 但默认不是按插入的顺序.  为了让Map  JSON ...

  6. python生成透时图片and 写文字

    import Image from get_png import getpng def transparent(infile): #open png,covert it into 'RGBA mode ...

  7. centos7 安装lamp

    1升级gcc4.8以上  yum update gcc2升级openssl     yum update openssl 3安装apache a 安装apr   ./configure --prefi ...

  8. 获取android控件的高度

    问题 如何获取一个控件的长和高,相信很多朋友第一眼看见这个问题都会觉得很简单,直接在onCreate里面调用getWidth.getMeasuredWidth不就可以获得了吗,但是,事实上是并没有简单 ...

  9. 学习笔记-----Android的View绘制过程

    边看源码边参考别人的博客等,做一下学习笔记. 要了解View的绘制,首先得知道View树的结构:(可以参考http://blog.csdn.net/qinjuning/article/details/ ...

  10. Oracle重启 error: ora-01034:oracle not available ora-27101:shared memory realm does not exist

    error: ora-01034:oracle not available ora-27101:shared memory realm does not exist 苦咖啡 他的博客中一篇文章完美的解 ...