写这么长了不A有点舍不得。。

想A又调不出来。。

于是乎就存一下..

屠龙宝刀点击就送

#include <cstdio>
#include <vector>
#define N 205000
using namespace std;
vector<int>Graph[N];
int max(int a,int b) {return a>b?a:b;}
int min(int a,int b) {return a>b?b:a;}
int Pri[N],n,m,dep[N],dad[N][],Max[N][],Min[N][],up[N][],down[N][];
void dfs(int x)
{
dep[x]=dep[dad[x][]]+;
for(int i=;dad[x][i];++i)
{
Max[x][i+]=max(Max[x][i],Max[dad[x][i]][i]);
Min[x][i+]=min(Min[x][i],Min[dad[x][i]][i]);
up[x][i+]=max(up[x][i],Max[dad[x][i]][i]-Min[x][i]);
up[x][i+]=max(up[x][i],up[dad[x][i]][i]);
down[x][i+]=max(down[x][i],down[dad[x][i]][i]);
down[x][i+]=max(down[x][i],Max[x][i]-Min[dad[x][i]][i]);
dad[x][i+]=dad[dad[x][i]][i];
}
for(int i=;i<Graph[x].size();++i)
{
int v=Graph[x][i];
if(dad[x][]!=v)
{
dad[v][]=x;
Max[v][]=max(Pri[x],Pri[v]);
Min[v][]=min(Pri[x],Pri[v]);
up[v][]=max(,Pri[x]-Pri[v]);
down[v][]=min(,Pri[v]-Pri[x]);
dfs(v);
}
}
}
int lca(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
for(int i=;i>=;--i)
if(dep[dad[y][i]]>=dep[x]) y=dad[y][i];
if(x==y) return x;
for(int i=;i>=;--i)
if(dad[y][i]!=dad[x][i]) x=dad[x][i],y=dad[y][i];
return dad[x][];
}
int Up(int x,int y)
{
int ret=,Minn=0x7fffffff;
if(dep[x]>dep[y]) swap(x,y);
for(int i=;i>=;--i)
{
if(dep[dad[y][i]]>=dep[x])
{
ret=max(ret,up[y][i]);
ret=max(ret,Max[y][i]-Minn);
Minn=min(Minn,Min[y][i]);
y=dad[y][i];
}
}
if(x==y) return ret;
for(int i=;i>=;--i)
{
if(dad[y][i]!=dad[x][i])
{
ret=max(ret,max(up[y][i],up[x][i]));
ret=max(ret,max(Max[y][i]-Minn,Max[x][i]-Minn));
Minn=min(Minn,min(Min[y][i],Min[x][i]));
y=dad[y][i];
x=dad[x][i];
}
}
return ret;
}
int Down(int x,int y)
{
int ret=,Maxn=;
if(dep[x]>dep[y]) swap(x,y);
for(int i=;i>=;--i)
{
if(dep[dad[y][i]]>=dep[x])
{
ret=min(ret,down[y][i]);
ret=min(ret,Maxn-Min[y][i]);
Maxn=max(Maxn,Max[y][i]);
y=dad[y][i];
}
}
if(x==y) return ret;
for(int i=;i>=;--i)
{
if(dad[y][i]!=dad[x][i])
{
ret=min(ret,min(down[y][i],down[x][i]));
ret=min(ret,min(Maxn-Min[y][i],Maxn-Min[x][i]));
Maxn=max(Maxn,max(Max[y][i],Max[x][i]));
y=dad[y][i];
x=dad[x][i];
}
}
return ret;
}
int query_max(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
int ret=Pri[y];
for(int i=;i>=;--i)
{
if(dep[dad[y][i]]>=dep[x])
{
ret=max(ret,Max[y][i]);
y=dad[y][i];
}
}
if(x==y) return ret;
for(int i=;i>=;--i)
{
if(dad[y][i]!=dad[x][i])
{
ret=max(ret,Max[x][i]);
ret=max(ret,Max[y][i]);
x=dad[x][i];
y=dad[y][i];
}
}
return ret;
}
int query_min(int x,int y)
{
if(dep[x]>dep[y]) swap(x,y);
int ret=Pri[y];
for(int i=;i>=;--i)
{
if(dep[dad[y][i]]>=dep[x])
{
ret=min(ret,Min[y][i]);
y=dad[y][i];
}
}
if(x==y) return ret;
for(int i=;i>=;--i)
{
if(dad[y][i]!=dad[x][i])
{
ret=min(ret,Min[x][i]);
ret=min(ret,Min[y][i]);
x=dad[x][i];
y=dad[y][i];
}
}
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;++i) scanf("%d",&Pri[i]);
for(int x,y,i=;i<n;++i)
{
scanf("%d%d",&x,&y);
Graph[x].push_back(y);
Graph[y].push_back(x);
}
dfs();
scanf("%d",&m);
for(int x,y;m--;)
{
scanf("%d%d",&x,&y);
if(x==y) {puts("");continue;}
int z=lca(x,y),ans=;
ans=max(ans,Up(x,z));
ans=max(ans,Down(y,z));
ans=max(ans,query_max(x,z)-query_min(y,z));
printf("%d\n",ans);
}
return ;
}

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

  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——T 3305 水果姐逛水果街Ⅱ

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

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

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

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

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

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

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

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

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

  9. codevs3305 水果姐逛水果街Ⅱ

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

  10. codevs3304 水果姐逛水果街

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

随机推荐

  1. npm安装appium server路过的坑

    1.因为appium服务器是用node.js开发的,所以第一步要安装nodejs. 安装后,系统默认配置的环境变量在C盘的用户目录下,为了避免以后下载的包都放在系统盘下, 配置npm下载的包存放目录和 ...

  2. AIRSDK 3.7 加载远程的含有代码的swf文件

    之前就说这个版本会解决可以加载远程的含有代码的swf文件的需求.但是,一直比较好奇这个是否行得通,还以为 Adobe 副总裁去了苹果,内部给了特殊待遇. 因为苹果一直就是不允许远程加载代码的,像js文 ...

  3. 在CentOS6.6上以replSet方式部署MongoDB集群

    此文已由作者袁欢授权网易云社区发布. 欢迎访问网易云社区,了解更多网易技术产品运营经验. 部署方式在3台centos6.6系统上以Replica Set方式部署mongodb3.0.2集群. 官方参考 ...

  4. 每次打开office 2013都提示配置进度,必须得等他下完然后重启,重启完了在打开,还是提示配置进度,怎么解决

    方法一: 我用下面的方法完美解决.在控制面板中1.删除旧版本2010 或者20032.删除激活程序3.重装2013激活程序done 方法二: 我把WPS卸载了就好了. 方法三: 我是按这个方法解决的, ...

  5. Kinect SDK(1):读取彩色、深度、骨骼信息并用OpenCV显示

    Kinect SDK 读取彩色.深度.骨骼信息并用OpenCV显示 一.原理说明 对于原理相信大家都明白大致的情况,因此,在此只说比较特别的部分. 1.1 深度流数据: 深度数据流所提供的图像帧中,每 ...

  6. RobotFramework特性总结

    robotframework是一款python编写的功能自动化测试框架.具备良好的可扩展性,支持关键字驱动,可以同时编写多种类型的客户端或者接口,可以进行分布式测试执行.主要用户轮次很多的验收测试和验 ...

  7. swap(2018.10.16)

    题意:给定一个{0,1,2,3,-,n-1}的排列 p. 一个{0,1,2 ,-,n-2}的排列 q 被认为是优美的排列, 当且仅当 q 满足下列条件 对排列 s={0,1,2,3,...,n-1}进 ...

  8. 生产者消费者 java.util.concurrent.lock包

    package com.mozq.thread.producer2; import java.util.concurrent.locks.Condition; import java.util.con ...

  9. mvn从下载安装到纯命令行创建第一个mvn程序(编码,编译,测试,安装,打包)全过程细致分解

    1.maven的下载和安装: a.maven的下载注意事项:如果你是windows,请选择①号,如果你是linux,请选择②号,下载地址:http://maven.apache.org/downloa ...

  10. django_view操作数据库

    1 create def add_area(request): area = Area.objects.create(name='commom',description='a commom area' ...