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

思路:lca维护区间差值。

#include<cstdio>
#include<iostream>
#include<vector>
#include<cstring>
using namespace std;
const int N=,pow=,maxx=;
vector<int> g[N];
int d[N],f[N][pow],maxv[N][pow]={},minv[N][pow],diff[N][pow]={},dife[N][pow]={},q[N];
// diff:顺区间最大差
// dife:逆区间最大差
void dfs(int x,int fa)
{
int i,t;
maxv[x][]=max(q[x],q[fa]);
minv[x][]=min(q[x],q[fa]);
diff[x][]=q[x]-q[fa];
dife[x][]=q[fa]-q[x];
d[x]=d[fa]+;
f[x][]=fa;
for(i=;i<pow;i++)
{
f[x][i]=f[f[x][i-]][i-];
maxv[x][i]=max(maxv[x][i-],maxv[f[x][i-]][i-]);
minv[x][i]=min(minv[x][i-],minv[f[x][i-]][i-]);
diff[x][i]=max(maxv[x][i-]-minv[f[x][i-]][i-],max(diff[x][i-],diff[f[x][i-]][i-]));
dife[x][i]=max(maxv[f[x][i-]][i-]-minv[x][i-],max(dife[x][i-],dife[f[x][i-]][i-]));
}
for(i=;i<g[x].size();i++)
if(g[x][i]!=fa)
dfs(g[x][i],x);
}
int lca(int a,int b)
{
int i,t,total=,flag=,maxn=,minn=maxx;
if(d[a]>d[b]){
flag=;
a^=b,b^=a,a^=b;
}
if(d[a]<d[b]){
t=d[b]-d[a];
for(i=;i<pow;i++)
if(t&(<<i)){
if(!flag){
total=max(total,maxn-minv[b][i]);
maxn=max(maxn,maxv[b][i]);
total=max(total,diff[b][i]);
}
else{
total=max(total,maxv[b][i]-minn);
minn=min(minn,minv[b][i]);
total=max(total,dife[b][i]);
}
b=f[b][i];
}
if(!flag) minn=q[a];
else maxn=q[a];
}
else{
if(!flag) minn=q[a],maxn=q[b];
else maxn=q[a],minn=q[b];
}
if(a!=b){
for(i=pow-;i>=;i--)
if(f[a][i]!=f[b][i]){
if(!flag){
total=max(total,maxv[a][i]-minn);
total=max(total,maxn-minv[b][i]);
total=max(total,dife[a][i]);
total=max(total,diff[b][i]);
maxn=max(maxn,maxv[b][i]);
minn=min(minn,minv[a][i]);
}
else{
total=max(total,maxv[b][i]-minn);
total=max(total,maxn-minv[a][i]);
total=max(total,diff[a][i]);
total=max(total,dife[b][i]);
maxn=max(maxn,maxv[a][i]);
minn=min(minn,minv[b][i]);
}
a=f[a][i],b=f[b][i];
}
total=max(total,maxn-minn);
if(!flag){
total=max(total,maxn-q[f[a][]]);
total=max(total,q[f[b][]]-minn);
}
else{
total=max(total,maxn-q[f[b][]]);
total=max(total,q[f[a][]]-minn);
}
}
return total;
}
int main(){
memset(minv,,sizeof(minv));
int n,m,i,j,x,y;
scanf("%d",&n);
for(i=;i<=n;i++)
scanf("%d",&q[i]);
for(i=;i<n;i++){
scanf("%d%d",&x,&y);
g[x].push_back(y);
g[y].push_back(x);
}
for(i=;i<g[].size();i++)
dfs(g[][i],);
scanf("%d",&m);
for(i=;i<=m;i++){
scanf("%d%d",&x,&y);
printf("%d\n",lca(x,y));
}
return ;
}

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

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

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

  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. codevs3305 水果姐逛水果街Ⅱ

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

  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. 利用安卓手机搭建WEB服务器

    背景介绍 Android是一种基于Linux的自由及开放源代码的操作系统 所以是用安卓来搭建服务器是完全可行的.接下来将教大家如何利用AndroPHP和Feel FTP(或者其他FTP管理器)来在安卓 ...

  2. hdu4405Aeroplane chess(概率与期望dp)

    Aeroplane chess Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)T ...

  3. Gym - 101981D The 2018 ICPC Asia Nanjing Regional Contest D.Country Meow 最小球覆盖

    题面 题意:给你100个三维空间里的点,让你求一个点,使得他到所有点距离最大的值最小,也就是让你找一个最小的球覆盖掉这n个点 题解:红书模板题,这题也因为数据小,精度也不高,所以也可以用随机算法,模拟 ...

  4. Python描述符:property()函数的小秘密

    描述符:将某种特殊类型的类的实例指派给另一个类的属性(注意:这里是类属性,而不是对象属性).而这种特殊类型的类就是实现了__get__,__set__,__delete__这三个方法中的一个或多个的新 ...

  5. B - Chat room

    Problem description Vasya has recently learned to type and log on to the Internet. He immediately en ...

  6. c# 官方文档必看

    https://docs.microsoft.com/zh-cn/dotnet/csharp/whats-new/csharp-version-history

  7. web前端利用HTML代码显示符号

    HTML常用符号代码:                       ´ ´ © © > > µ µ ® ® & & ° ° ¡ ¡     » » ¦ ¦ ÷ ÷ ¿ ¿ ...

  8. 酷派改变者S1(C105/C105-6/C105-8) 解锁BootLoader 并刷入recovery root

    首先下载好工具链接:https://pan.baidu.com/s/1qZjOCUw 密码:u2dr 备用下载链接:https://pan.baidu.com/s/1pMlmAef 本篇教程教你如何傻 ...

  9. VMWare 安装Centos 6.9

    1.新建虚拟机 (1)点击文件-->新建虚拟机 (2)选择 自定义(高级)--> 下一步 (3)选择Workstation 12.0 --> 下一步 (4)选择 稍后安装操作系统 - ...

  10. i合拍应用客户端安卓项目源码

    i合拍是一款新型的拍照社交App它可以让你和朋友,亲人,陌生人合拍一张照片参与别人的合拍,体现自己的创意使用说明:使用了gpuimage进行滤镜渲染 实现远程合拍,分享合拍等一系列功能. 手机app下 ...