本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作。

本文作者:ljh2000
作者博客:http://www.cnblogs.com/ljh2000-jump/
转载请注明出处,侵权必究,保留最终解释权!

 
题目描述 Description

水果姐第二天心情也很不错,又来逛水果街。

突然,cgh又出现了。cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径)。

同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。

cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去。求最多可以赚多少钱。

水果姐向学过oi的你求助。

输入描述 Input Description

第一行n,表示有n家店

下来n个正整数,表示每家店一个苹果的价格。

下来n-1行,每行两个整数x,y,表示第x家店和第y家店有一条边。

下来一个整数m,表示下来有m个询问。

下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。

输出描述 Output Description

有m行。

每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。

样例输入 Sample Input

10
16 5 1 15 15 1 8 9 9 15
1 2
1 3
2 4
2 5
2 6
6 7
4 8
1 9
1 10
6
9 1
5 1
1 7
3 3
1 1
3 6

样例输出
Sample Output

7
11
7
0
0
15

数据范围及提示
Data Size & Hint

0<=苹果的价格<=10^8

0<n<=200000

0<m<=10000

 
 
正解:倍增
解题报告:
  这道题可以说是一道倍增裸题呢...然而我怎么第一眼就看出是个链剖...
  考虑我们的路径是有方向的,也就是说必须是先买后卖。常规思路就是维护往上跳的最大值、最小值和最大收益。但是难以处理往下的情况。
  容易发现我们做向上跳的最大收益的时候,是用上面的大-下面的小,那么如果我维护一个新的数组,用下面的大-上面的小就可以得到往下跳的最大收益。同时我维护x到lca的最小值和y到lca的最大值,再用这个最大值减最小值更新一下答案即可。
 
 
 //It is made by ljh2000
#include <iostream>
#include <cstdlib>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <ctime>
#include <vector>
#include <queue>
#include <map>
#include <set>
#include <string>
#include <stack>
using namespace std;
typedef long long LL;
const int MAXN = ;
const int inf = (<<);
int n,m,a[MAXN],deep[MAXN],ecnt,first[MAXN],to[MAXN*],next[MAXN*];
int f[MAXN][],maxl[MAXN][],minl[MAXN][],g[MAXN][],ans,p[MAXN][]; inline int getint(){
int w=,q=; char c=getchar(); while((c<''||c>'') && c!='-') c=getchar();
if(c=='-') q=,c=getchar(); while (c>=''&&c<='') w=w*+c-'',c=getchar(); return q?-w:w;
} inline void dfs(int x,int fa){
for(int i=first[x];i;i=next[i]) {
int v=to[i]; if(v==fa) continue;
f[v][]=x; deep[v]=deep[x]+;
maxl[v][]=max(a[v],a[x]); minl[v][]=min(a[v],a[x]);
g[v][]=max(,a[x]-a[v]);
p[v][]=max(,a[v]-a[x]);
dfs(v,x);
}
} inline void lca(int x,int y){
int t=; int minx=inf,maxy=; ans=;
if(deep[x]<deep[y]) {
while((<<t)<=deep[y]) t++; t--;
for(int i=t;i>=;i--)
if(deep[y]-(<<i)>=deep[x])
ans=max(ans,p[y][i]),ans=max(ans,maxy-minl[y][i]),maxy=max(maxy,maxl[y][i]),y=f[y][i];
}
else{
while((<<t)<=deep[x]) t++; t--;
for(int i=t;i>=;i--)
if(deep[x]-(<<i)>=deep[y])
ans=max(ans,g[x][i]),ans=max(ans,maxl[x][i]-minx),minx=min(minx,minl[x][i]),x=f[x][i];
}
if(x==y) return ;
for(int i=t;i>=;i--) {
if(f[x][i]!=f[y][i]) {
ans=max(g[x][i],ans);
ans=max(p[y][i],ans);
ans=max(ans,maxl[x][i]-minx);
ans=max(ans,maxy-minl[y][i]);
maxy=max(maxy,maxl[y][i]);
minx=min(minx,minl[x][i]);
x=f[x][i]; y=f[y][i];
}
}
ans=max(g[x][],ans);
ans=max(p[y][],ans);
maxy=max(maxy,maxl[y][]);
minx=min(minx,minl[x][]);
ans=max(ans,maxy-minx);
} inline void work(){
n=getint(); for(int i=;i<=n;i++) a[i]=getint(); int x,y;
for(int i=;i<n;i++) {
x=getint(); y=getint();
next[++ecnt]=first[x]; first[x]=ecnt; to[ecnt]=y;
next[++ecnt]=first[y]; first[y]=ecnt; to[ecnt]=x;
}
deep[]=;
dfs(,);
for(int j=;j<=;j++) {
for(int i=;i<=n;i++) {
f[i][j]=f[f[i][j-]][j-];
if(f[i][j]==) continue;
maxl[i][j]=max(maxl[i][j-],maxl[f[i][j-]][j-]);
minl[i][j]=min(minl[i][j-],minl[f[i][j-]][j-]);
g[i][j]=max(g[i][j-],g[f[i][j-]][j-]);
p[i][j]=max(p[i][j-],p[f[i][j-]][j-]);
g[i][j]=max(g[i][j],maxl[f[i][j-]][j-]-minl[i][j-]);
p[i][j]=max(p[i][j],maxl[i][j-]-minl[f[i][j-]][j-]);
}
}
m=getint();
while(m--) {
x=getint(); y=getint();
lca(x,y);
printf("%d\n",ans);
}
} int main()
{
work();
return ;
}

codevs3305 水果姐逛水果街Ⅱ的更多相关文章

  1. 水果姐逛水果街Ⅱ codevs 3305

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB   题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  3. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

    题目:http://codevs.cn/problem/3305/  时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 Des ...

  4. codevs 3305 水果姐逛水果街Ⅱ&&codevs3006

    题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...

  5. CodeVs——T 3305 水果姐逛水果街Ⅱ

    http://codevs.cn/problem/3305/  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解  查看运行结果     题目描述 De ...

  6. codevs3304 水果姐逛水果街

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  7. 水果姐逛水果街Ⅰ(codevs 3304)

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

  8. Codevs 3304 水果姐逛水果街Ⅰ 线段树

    题目: http://codevs.cn/problem/3304/   时间限制: 2 s   空间限制: 256000 KB   题目等级 : 钻石 Diamond 题解       题目描述 D ...

  9. codevs3304 水果姐逛水果街Ⅰ

    题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...

随机推荐

  1. IT教程网

    这个IT教程网(印度),我认为是最好的.里面的知识基础实用,覆盖面很广,作为IT入门和了解都是极好的. http://www.tutorialspoint.com/

  2. mvc route的注册,激活,调用流程

    mvc route的注册,激活,调用流程(三) net core mvc route的注册,激活,调用流程 mvc的入口是route,当前请求的url匹配到合适的route之后,mvc根据route所 ...

  3. salt yum安装lamp

    在批量安装软件前,先找台测试机yum装一遍,看是否报错等,是否依赖包全等 .         本次我们在dev环境下搞. 先看一下已搞成功的目录结构         定义dev环境的第二个好处     ...

  4. Oracle Coherence应用部署到Jboss EAP 6.x 时 NoClassDefFoundError: sun/rmi/server/MarshalOutputStream 的解决办法

    今天将一个web应用从weblogic 10.3迁移到jboss EAP 6.3上,该应用使用oracle coherence做为缓存,部署上去后,启动时一直报如下错误:     at java.ut ...

  5. MyBatis.Net 学习手记

    MyBatis.NET的前身为IBatis,是JAVA版MyBatis在.NET平台上的翻版,相对NHibernate.EntityFramework等重量级ORM框架而言,MyBatis.NET必须 ...

  6. .NET MVC HtmlHepler

    一.HtmlHepler 1.ActionLink() 动态生成 超链接:根据路由规则,生成对应的 html 代码. //1.注册路由信息 routes.MapRoute( name: "D ...

  7. AngularJS中实现无限级联动菜单

    多级联动菜单是常见的前端组件,比如省份-城市联动.高校-学院-专业联动等等.场景虽然常见,但仔细分析起来要实现一个通用的无限分级联动菜单却不一定像想象的那么简单.比如,我们需要考虑子菜单的加载是同步的 ...

  8. PS技能大全

    1.设置固定的图片大小 参考:http://jingyan.baidu.com/album/642c9d3418bec4644a46f72a.html?picindex=1

  9. 最短判断IE的办法

    if(!!-[1,]){ return }; 无意中看到这样一行代码,经查是用来判断IE的代码,非常精简,原理如下: [1,],这是一个数组,IE和标准浏览器对这样一个数组的解析是不一样的 alert ...

  10. 软件工程(FZU2015)增补作业

    说明 张老师为FZU软件工程2015班级添加了一次增补作业,总分10分,deadline是2016/01/01-2016/01/03 前11次正式作业和练习的迭代评分见:http://www.cnbl ...