3305 水果姐逛水果街Ⅱ

 时间限制: 2 s
 空间限制: 256000 KB
 
题目描述 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

用f[i][j]表示i往上2^j的祖先。

mx[i][j]表示i到f[i][j]的最大值

mi[i][j]表示i到f[i][j]的最小值

fr[i][j]表示f[i][j]到i的最大获利

to[i][j]表示i到f[i][j]的最大获利

递推方程:

f[i][j]=f[f[i][j-1]][j-1];

mx[i][j]=max(mx[i][j-1],mx[f[i][j-1]][j-1]);

mi[i][j]=max(mi[i][j-1],mi[f[i][j-1]][j-1]);

fr[i][j]=max(fr[i][j-1],fr[f[i][j-1][j-1],mx[f[i][j-1]][j-1]-mi[i][j-1]);

to[i][j]=max(to[i][j-1],to[f[i][j-1]][j-1],mx[i][j-1]-mi[f[i][j-1]][j-1]);

1,2,3不解释,4,5:对于从f[i][j]到i的最大值有可能在f[i][j-1]到i或f[i][j]到f[i][j-1]这一段或分别在这两段,两个类同。

所以对于树上两点u,v的最大获益有三种可能:

1.在u到lca(u,v);

2.在v到lca(u,v);

3.在1买入,在2售出;

所以求解时只需要在u,v分别往上跳即可.

#include<cstdio>
#include<algorithm>
using namespace std;
const int N=,INF=1e9;
struct X
{
int v,f,n;
}x[N<<];
int sale[N],s,dep[N],f[N][],mx[N][],mi[N][],fr[N][],to[N][];
int read()
{
char c;
while((c=getchar())<''||c>'');
int re=c-'';
while((c=getchar())>=''&&c<='') re=(re<<)+(re<<)+c-'';
return re;
}
void add(int u,int v)
{
x[++s].n=x[u].f;
x[x[u].f=s].v=v;
}
void dfs(int u,int fa)
{
dep[u]=dep[f[u][]=fa]+;
mx[u][]=max(sale[u],sale[fa]);
mi[u][]=min(sale[u],sale[fa]);
fr[u][]=sale[u]-sale[fa];
to[u][]=-fr[u][];
for(int i=;i<;i++)
{
f[u][i]=f[f[u][i-]][i-];
mx[u][i]=max(mx[f[u][i-]][i-],mx[u][i-]);
mi[u][i]=min(mi[f[u][i-]][i-],mi[u][i-]);
fr[u][i]=max(max(fr[f[u][i-]][i-],fr[u][i-]),mx[u][i-]-mi[f[u][i-]][i-]);
to[u][i]=max(max(to[f[u][i-]][i-],to[u][i-]),mx[f[u][i-]][i-]-mi[u][i-]);
}
for(int i=x[u].f;i;i=x[i].n)
if(x[i].v!=fa) dfs(x[i].v,u);
}
int lca(int u,int v)
{
if(dep[u]<dep[v]) swap(u,v);
int dlt=dep[u]-dep[v];
for(int i=;i<;i++)
if(dlt>>i&) u=f[u][i];
if(u==v) return v;
for(int i=;i>=;i--)
if(f[u][i]!=f[v][i]) u=f[u][i],v=f[v][i];
return f[u][];
}
int main()
{
int n=read();
for(int i=;i<=n;i++) sale[i]=read();
while(--n)
{
int u=read(),v=read();
add(u,v);add(v,u);
}
dfs(,);
n=read();
while(n--)
{
int u=read(),v=read(),fath=lca(u,v),dlt=dep[u]-dep[fath],maxx=-INF,minn=INF,ans=;
if(dlt)//从u跳
for(int i=;i<;i++)
if(dlt>>i&)
{
ans=max(ans,max(to[u][i],mx[u][i]-minn));
minn=min(minn,mi[u][i]);
u=f[u][i];
}
dlt=dep[v]-dep[fath];
if(dlt)//从v跳
for(int i=;i<;i++)
if(dlt>>i&)
{
ans=max(ans,max(fr[v][i],maxx-mi[v][i]));
maxx=max(maxx,mx[v][i]);
v=f[v][i];
}
ans=max(maxx-minn,ans);//用历史最大与历史最小相减
printf("%d\n",ans);
}
return ;
}

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

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

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

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

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

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

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

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

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

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

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

  6. CodeVs——T 3304 水果姐逛水果街Ⅰ

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

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

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

  8. codevs3305 水果姐逛水果街Ⅱ

    本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...

  9. codevs3304 水果姐逛水果街

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

随机推荐

  1. mongodb高级查询

    前几篇,老玩家绕道即可,新手晚上闲着也是蛋疼,不如把命令敲一边,这样你就会对MongoDB有一定的掌握啦.如果没有安装MongoDB去看我的上一篇博客  MongoDB下载安装与简单增删改查 前奏:启 ...

  2. MVC4中 访问webservice 出现无法找到资源的错误

    出现这个情况,是mvc将webservice.asmx解析成了控制器,下面先将这个控制器忽略 继续访问出现这样的错误: 下面修改配置文件 访问成功

  3. JVM类加载过程

    先不说JVM类加载的原理,先看实例: NormalTest类,包含了一个静态代码块,执行的任务就是打印一句话. /** * 在正常类加载条件下,看静态代码块是否会执行 * @author jianyi ...

  4. terminator 安装及使用

    1. 安装 $ sudo apt-get install terminator 2. 右键设置首选项 背景设置为0.8透明度, 字体挤在一起:在ubuntu下请选择mono后缀的字体就可以了 3. 使 ...

  5. sed字符串替换

    把drivers目录下的所有pr_log替换成:pr_snd sed -i "s/pr_log/pr_snd/g" `grep pr_log -rl drivers/` 把driv ...

  6. Centos 7 在VBox下不能联网

    摘要: 在Virtual Box下选择了Bridge Adaptor模式,安装CENTOS 7,网络连接一直都没有问题,后来不知道什么缘故就突然不能联网,很是烦恼,查询了很多网络方面的配置信息,也做了 ...

  7. system verilog的一些总结(从其他博客复制来的)

    转载自 http://blog.sina.com.cn/s/blog_e7fec2630101f5t9.html SystemVerilog是一种硬件描述和验证语言(HDVL),它基于IEEE 136 ...

  8. UEFI+GPT引导实践篇(二):UEFI引导安装64位Win7/Win8

    下文是在联想Y480笔记本上以UEFI方式启动安装Windows8的全过程,安装Windows7过程基本相同.注意,如果你的电脑硬盘是MBR分区结构,安装过程中将要删除硬盘上所有数据,请安装前备份硬盘 ...

  9. Linux 任务计划

    一.配置cron实现自动化 使用cron实现任务自动化可以通过修改/etc/crontab文件以及使用crontab命令实现,其结果是一样的. 1./etc/crontab文件实现自动化 cron守护 ...

  10. Bat命令学习

    基础部分:====================================================================== 一.基础语法: 1.批处理文件是一个“.bat” ...