(WWWWWWWWWW)codevs 3305 水果姐逛水果街Ⅱ
写这么长了不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 水果姐逛水果街Ⅱ的更多相关文章
- 水果姐逛水果街Ⅱ 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的水果姐迅速发现了 ...
随机推荐
- python--numpy模块、spicy模块、 matplotlib模块
一:numpy模块 ndarray:存储单一数据类型的多维数组 ufunc:能够对数组进行处理的函数(universal function object) #numpy 中arange用法,指定开始值 ...
- 【216】◀▶ IDL 字符串操作说明
参考:String Processing Routines —— 字符串处理函数 01 STRING 返回字符串. 02 STRCMP 比较字符串,一样返回1,不一样返回0,默认大小写敏感. ...
- Java字节码指令收集大全
Java字节码指令大全 常量入栈指令 指令码 操作码(助记符) 操作数 描述(栈指操作数栈) 0x01 aconst_null null值入栈. 0x02 iconst_m1 -1(int)值入栈. ...
- iOS 中使用 MJExtension 遇到 关键字(id) 怎么办
MJExtension 是个人比较喜欢用的json 转model 的软件,当遇到系统关键字时就会出现崩溃,解决方式如下 1.建立Modle 解析类,服务返回数据中带有id,这个时候用字典转Mode(m ...
- 在win下启动memcached
memcached -m 64 -p 11211 -vvv 设置默认内存64,默认端口11211 ,输出功能及警告错误等信息
- DMOJ IOI '17 P3 - Toy Train【拓扑排序】
传送:https://dmoj.ca/problem/ioi17p3 参考:https://blog.csdn.net/qq_27327327/article/details/80711824 妙啊- ...
- [Xcode 实际操作]九、实用进阶-(18)图像人脸识别:对图片中的人像进行面部检测
目录:[Swift]Xcode实际操作 本文将演示对图片中的人像,进行面部检测. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit //导入 ...
- 「开源」SpringCloud+vue搭建的商城项目
最近在研究SpringCloud,看到一个基于SpringCloud+vue搭建的模拟商城项目.用来辅助学习SpringCloud企业级开发还是很有帮助的.强烈推荐!! 源码地址在最后. spring ...
- github 收藏项目的方法
1,Watching 需要收藏的项目 2,查看收藏的项目
- [软件工程基础]PhyLab 需求与功能分析改进文档
NABCD 模型 Need 需求 根据 Default 的需求文档,物理实验网站对于北航大二学生完成物理实验有较大的帮助,反馈较好.由于在 2016-2017 春季学期,网站数据库因为不明原因被删除了 ...