codevs 3305 水果姐逛水果街Ⅱ
/*我尼玛 又一个min打成max 看了半天....*/
#include<iostream>
#include<cstdio>
#include<cstring>
#define maxn 200010
#define inf 0x7fffffff
using namespace std;
int n,m,head[maxn],num,v[maxn],fa[maxn][],c[maxn];
int mii[maxn][],mxx[maxn][],up[maxn][],down[maxn][];
struct node{
int v,pre;
}e[maxn*];
int init(){
int x=;char s=getchar();
while(s<''||s>'')s=getchar();
while(s>=''&&s<=''){x=x*+s-'';s=getchar();}
return x;
}
void Add(int from,int to){
num++;e[num].v=to;
e[num].pre=head[from];
head[from]=num;
}
void Dfs(int now,int from,int dep,int val){
fa[now][]=from;c[now]=dep;
mii[now][]=min(val,v[now]);
mxx[now][]=max(val,v[now]);
up[now][]=max(,v[from]-v[now]);
down[now][]=max(,v[now]-v[from]);
for(int i=head[now];i;i=e[i].pre){
if(e[i].v==from)continue;
Dfs(e[i].v,now,dep+,v[now]);
}
}
void Get_fa(){
for(int j=;j<=;j++)
for(int i=;i<=n;i++){
fa[i][j]=fa[fa[i][j-]][j-];
mii[i][j]=min(mii[i][j-],mii[fa[i][j-]][j-]);
mxx[i][j]=max(mxx[i][j-],mxx[fa[i][j-]][j-]);
up[i][j]=max(up[i][j-],up[fa[i][j-]][j-]);
up[i][j]=max(up[i][j],mxx[fa[i][j-]][j-]-mii[i][j-]);
down[i][j]=max(down[i][j-],down[fa[i][j-]][j-]);
down[i][j]=max(down[i][j],mxx[i][j-]-mii[fa[i][j-]][j-]);
}
}
int LCA(int a,int b){
if(c[a]<c[b])swap(a,b);
int t=c[a]-c[b];
for(int i=;i<=;i++)
if((<<i)&t)a=fa[a][i];
if(a==b)return a;
for(int i=;i>=;i--)
if(fa[a][i]!=fa[b][i]){
a=fa[a][i];
b=fa[b][i];
}
return fa[a][];
}
int Up_lca(int a,int b){
int t=c[a]-c[b],ret=,minner=inf;
for(int i=;i<=;i++)
if((<<i)&t){
ret=max(ret,up[a][i]);
ret=max(ret,mxx[a][i]-minner);
minner=min(minner,mii[a][i]);
a=fa[a][i];
}
return ret;
}
int Down_lca(int a,int b){
int t=c[a]-c[b],ret=,maxxer=;
for(int i=;i<=;i++)
if((<<i)&t){
ret=max(ret,down[a][i]);
ret=max(ret,maxxer-mii[a][i]);
maxxer=max(maxxer,mxx[a][i]);
a=fa[a][i];
}
return ret;
}
int Query_max(int a,int b){
int t=c[a]-c[b],maxxer=v[a];
for(int i=;i<=;i++)
if((<<i)&t){
maxxer=max(maxxer,mxx[a][i]);
a=fa[a][i];
}
return maxxer;
}
int Query_min(int a,int b){
int t=c[a]-c[b],minner=v[a];
for(int i=;i<=;i++)
if((<<i)&t){
minner=min(minner,mii[a][i]);
a=fa[a][i];
}
return minner;
}
int main()
{
n=init();
for(int i=;i<=n;i++)
v[i]=init();
int u,v;
for(int i=;i<n;i++){
u=init();v=init();
Add(u,v);Add(v,u);
}
memset(mii,,sizeof(mii));
Dfs(,,,);Get_fa();
m=init();
while(m--){
u=init();v=init();
int anc=LCA(u,v);
//printf("%d\n",anc);
int ans=;
ans=max(Up_lca(u,anc),Down_lca(v,anc));
ans=max(ans,Query_max(v,anc)-Query_min(u,anc));
printf("%d\n",ans);
}
return ;
}
codevs 3305 水果姐逛水果街Ⅱ的更多相关文章
- 水果姐逛水果街Ⅱ codevs 3305
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...
- code vs 3305 水果姐逛水果街Ⅱ
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 水果姐第二天心情也很不错, ...
- Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
题目:http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Des ...
- CodeVs——T 3305 水果姐逛水果街Ⅱ
http://codevs.cn/problem/3305/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 De ...
- codevs 3305 水果姐逛水果街Ⅱ&&codevs3006
题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径). 同样还是n家水果店,编号为1~ ...
- Codevs 3304 水果姐逛水果街Ⅰ 线段树
题目: http://codevs.cn/problem/3304/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 D ...
- CodeVs——T 3304 水果姐逛水果街Ⅰ
http://codevs.cn/problem/3304/ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 查看运行结果 题目描述 Des ...
- 水果姐逛水果街Ⅰ(codevs 3304)
题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...
- codevs3305 水果姐逛水果街Ⅱ
本文版权归ljh2000和博客园共有,欢迎转载,但须保留此声明,并给出原文链接,谢谢合作. 本文作者:ljh2000作者博客:http://www.cnblogs.com/ljh2000-jump/转 ...
- codevs3304 水果姐逛水果街
题目描述 Description 水果姐今天心情不错,来到了水果街. 水果街有n家水果店,呈直线结构,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样. 学过oi的水果姐迅速发现了 ...
随机推荐
- for循环,列表和格式化输出
一:for 循环 1. 简单的说如果让你输出1到100之间的整数,用while该怎么实现呢? i= : print(i) i+= 看着是不是只有4行,但是有没有更加简单的办法,不妨我 ...
- 安装search everything中文语言包
Everything 作为很多人的必备工具,特写这篇文章,一方面让想使用国外优秀软件的英语小白有一段过渡期,另一方面也为自己整理下资料.当然,这个可不是不学好英语的正当理由. 步骤: 1. 下载好se ...
- android的padding和margin的区别
android:padding和android:layout_margin的区别:padding是站在父view的角度描述问题,它规定它里面的内容必须与这个父view边界的距离. margin则是站在 ...
- bzoj2096: [Poi2010]Pilots
Description Tz又耍畸形了!!他要当飞行员,他拿到了一个飞行员测试难度序列,他设定了一个难度差的最大值,在序列中他想找到一个最长的子串,任意两个难度差不会超过他设定的最大值.耍畸形一个人是 ...
- iOS: 获取文件路径
iOS: 获取文件路径 // 例如 - (NSString *)applicationDocumentsDirectory { return [NSSearchPathForDirectories ...
- 工作总结:MFC使用Windows自带打开对话框
代码: ; //Win98 as default LPARAM lModuleParam = ; TV_INSERTSTRUCT tvItem; CString sPathNameSel; ];//1 ...
- Java中final、finally和finalize的区别(转)
http://www.cnblogs.com/bluestorm/archive/2012/04/22/2464746.html final 用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖, ...
- Grails架设和配置--起步
现在作这些配置有些轻车熟路了.. 因为RAILS ON RUBY和它真的有很多相像的,, 什么DRY,什么约定先于配置这些的概念... 然后,GITHUB上有好文档,可以一步一步的实践.. https ...
- 【HDOJ】2371 Decode the Strings
快速矩阵乘法.注意,原始字符串即为decode后的字符串.题目是要找到原始串. #include <cstdio> #include <cstring> #define MAX ...
- ZOJ-2008-Invitation Cards(dijkstra)
题意: 在有向加权图中G(V,E),邮局要从起点S向其他n个节点发送邮件,于是派出n个邮递员,分别到达其他n个地点发送,然后回到起点S,求出所有邮递员所经过的总路程的最小值. 分析: 正向一次dijk ...