Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA
水果姐第二天心情也很不错,又来逛水果街。
突然,cgh又出现了。cgh施展了魔法,水果街变成了树结构(店与店之间只有一条唯一的路径)。
同样还是n家水果店,编号为1~n,每家店能买水果也能卖水果,并且同一家店卖与买的价格一样。
cgh给出m个问题,每个问题要求水果姐从第x家店出发到第y家店,途中只能选一家店买一个水果,然后选一家店(可以是同一家店,但不能往回走)卖出去。求最多可以赚多少钱。
水果姐向学过oi的你求助。
第一行n,表示有n家店
下来n个正整数,表示每家店一个苹果的价格。
下来n-1行,每行两个整数x,y,表示第x家店和第y家店有一条边。
下来一个整数m,表示下来有m个询问。
下来有m行,每行两个整数x和y,表示从第x家店出发到第y家店。
有m行。
每行对应一个询问,一个整数,表示面对cgh的每次询问,水果姐最多可以赚到多少钱。
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
7
11
7
0
0
15
0<=苹果的价格<=10^8
0<n<=200000
0<m<=10000
#include<bits/stdc++.h>
using namespace std;
#define MAXN 200010
#define INF 1e9
struct node
{
int begin,end,next;
}edge[MAXN*];
int cnt,Head[MAXN],n,P[MAXN][],mx[MAXN][],mn[MAXN][],lc[MAXN][],rc[MAXN][],deep[MAXN],a[MAXN];
bool vis[MAXN];
void addedge(int bb,int ee)
{
edge[++cnt].begin=bb;edge[cnt].end=ee;edge[cnt].next=Head[bb];Head[bb]=cnt;
}
void addedge1(int bb,int ee)
{
addedge(bb,ee);addedge(ee,bb);
}
int read()
{
int s=,fh=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')fh=-;ch=getchar();}
while(ch>=''&&ch<=''){s=s*+(ch-'');ch=getchar();}
return s*fh;
}
void dfs1(int u)
{
int i,j,v;
vis[u]=true;
for(j=;(<<j)<=n;j++)
{
P[u][j]=P[P[u][j-]][j-];
mx[u][j]=max(mx[u][j-],mx[P[u][j-]][j-]);
mn[u][j]=min(mn[u][j-],mn[P[u][j-]][j-]);
lc[u][j]=max(lc[u][j-],lc[P[u][j-]][j-]);
lc[u][j]=max(lc[u][j],mx[P[u][j-]][j-]-mn[u][j-]);
rc[u][j]=max(rc[u][j-],rc[P[u][j-]][j-]);
rc[u][j]=max(rc[u][j],mx[u][j-]-mn[P[u][j-]][j-]);
}
for(i=Head[u];i!=-;i=edge[i].next)
{
v=edge[i].end;
if(vis[v]==false)
{
deep[v]=deep[u]+;
P[v][]=u;
mx[v][]=max(a[u],a[v]);//最大值
mn[v][]=min(a[u],a[v]);//最小值
lc[v][]=max(,a[u]-a[v]);//从i点到达fa[i][j]点的最大利润.
rc[v][]=max(,a[v]-a[u]);//从fa[i][j]点到达i点的最大利润.
dfs1(v);
}
}
}
/*void Ycl()
{
int i,j;
for(j=1;(1<<j)<=n;j++)
{
for(i=1;i<=n;i++)
{
if(P[i][j-1]!=-1)
{
P[i][j]=P[P[i][j-1]][j-1];
mx[i][j]=max(mx[i][j],max(mx[i][j-1],mx[P[i][j-1]][j-1]));
mn[i][j]=min(mn[i][j],min(mn[i][j-1],mn[P[i][j-1]][j-1]));
lc[i][j]=max(lc[i][j],max(lc[i][j-1],lc[P[i][j-1]][j-1]));
lc[i][j]=max(lc[i][j],mx[P[i][j-1]][j-1]-mn[i][j-1]);
rc[i][j]=max(rc[i][j],max(rc[i][j-1],rc[P[i][j-1]][j-1]));
rc[i][j]=max(rc[i][j],mx[i][j-1]-mn[P[i][j-1]][j-1]);
}
}
}
}*/
int LCA(int x,int y)
{
int i,j;
if(deep[x]<deep[y])swap(x,y);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)if(deep[x]-(<<j)>=deep[y])x=P[x][j];
if(x==y)return x;
for(j=i;j>=;j--)
{
if(P[x][j]!=-&&P[x][j]!=P[y][j])
{
x=P[x][j];
y=P[y][j];
}
}
return P[x][];
}
int MAX1(int x,int y)
{
int i,j,maxv=-INF;
if(deep[x]<deep[y])swap(x,y);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)
{
if(deep[x]-(<<j)>=deep[y])
{
maxv=max(maxv,lc[x][j]);
x=P[x][j];
}
}
return maxv;
}
int MAX2(int x,int y)
{
int i,j,maxv=-INF;
if(deep[x]<deep[y])swap(x,y);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)
{
if(deep[x]-(<<j)>=deep[y])
{
maxv=max(maxv,rc[x][j]);
x=P[x][j];
}
}
return maxv;
}
int MX(int x,int y)
{
int i,j,maxv=-INF;
if(deep[x]<deep[y])swap(x,y);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)
{
if(deep[x]-(<<j)>=deep[y])
{
maxv=max(maxv,mx[x][j]);
x=P[x][j];
}
}
return maxv;
}
int MN(int x,int y)
{
int i,j,minv=INF;
if(deep[x]<deep[y])swap(x,y);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)
{
if(deep[x]-(<<j)>=deep[y])
{
minv=min(minv,mn[x][j]);
x=P[x][j];
}
}
return minv;
}
int Ask(int x,int y)
{
int lca=LCA(x,y),xx=x,yy=y,i,j;
int maxxx=-INF,minnn=INF,ans=;
if(deep[x]<deep[lca])swap(x,lca);
for(i=;(<<i)<=deep[x];i++);i--;
for(j=i;j>=;j--)
{
if(deep[x]-(<<j)>=deep[lca])
{
ans=max(ans,max(lc[x][j],mx[x][j]-minnn));
minnn=min(mn[x][j],minnn);
x=P[x][j];
}
}
if(deep[y]<deep[lca])swap(y,lca);
for(i=;(<<i)<=deep[y];i++);i--;
for(j=i;j>=;j--)
{
if(deep[y]-(<<j)>=deep[lca])
{
ans=max(ans,max(rc[y][j],maxxx-mn[y][j]));
maxxx=max(mx[y][j],maxxx);
y=P[y][j];
}
}
return max(ans,maxxx-minnn);
}
int main()
{
int bb,ee,i,j,m,x,y,ans,lca;
n=read();
for(i=;i<=n;i++)a[i]=read();
memset(Head,-,sizeof(Head));cnt=;
for(i=;i<n;i++)
{
bb=read();ee=read();
addedge1(bb,ee);
}
memset(P,-,sizeof(P));
/*for(j=1;(1<<j)<=n;j++)
{
for(i=1;i<=n;i++)
{
mn[i][j]=0;mx[i][j]=0;
lc[i][j]=rc[i][j]=0;
}
}*/
dfs1();//Ycl();
m=read();
for(i=;i<=m;i++)
{
x=read();y=read();
if(x==y)printf("0\n");
else// if(x<y)
{
printf("%d\n",Ask(x,y));
//if(x>y)swap(x,y);
/*lca=LCA(x,y);
ans=0;
ans=max(ans,MAX1(x,lca));
ans=max(ans,MAX2(lca,y));
ans=max(ans,MX(lca,y)-MN(x,lca));
printf("%d\n",ans);*/
}
/*else
{
lca=LCA(x,y);
ans=-INF;
ans=max(ans,MAX1(x,lca));
ans=max(ans,MAX2(y,lca));
ans=max(ans,MX(y,lca)-MN(x,lca));
printf("%d\n",ans);
}*/
}
return ;
}
Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA的更多相关文章
- 水果姐逛水果街Ⅱ codevs 3305
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目描述 Description 水果姐第二天心情也很不错,又来逛水果街. 突然,cgh又出现了.cgh施展了魔 ...
- code vs 3305 水果姐逛水果街Ⅱ
3305 水果姐逛水果街Ⅱ 时间限制: 2 s 空间限制: 256000 KB 题目等级 : 钻石 Diamond 题解 题目描述 Description 水果姐第二天心情也很不错, ...
- 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的水果姐迅速发现了 ...
随机推荐
- mvc5 + ef6 + autofac搭建项目(repository+uow)(一)
直奔主题了,不那么啰嗦. 整体框架的参考来源是 O# 的框架,在此感谢锋哥一直以来的开源,让我们有的学 如下图: (图一) 一下分三个步骤说明,分别为 dbContext,repository,uo ...
- UITextField,常见属性的罗列和用法
UITextField是UIControl的子类 ,属于控件类(因为它有能力响应一些高级事件),在故事版中可以直接拖拽过来使用. 首先定义 UITextField *name; name = [[UI ...
- iOS截屏代码
转载自:http://m.open-open.com/m/code/view/1420469506375 1.普通界面 /** *截图功能 */ -(void)screenShot{ UIGraphi ...
- C# CRC校验的一点感悟
今天在鼓捣一个手持操作器的时候,遇到一点问题,记录一下今天的经验包 由于之前公司产品在校验时基本上都是和校验,今天在准备用C#模拟一个古董操作器的时候,却遇到一个问题,模拟器发出的数据,主板一律不回复 ...
- React初探
经过几天根据官方文档和博园中一些大牛的文章,在了解过基础的语法和组件后,总结一下: 1.第一件事就是分析界面,理想状态下是让每个组件只做一件事情,也就是单一职责,相互嵌套.我认为: 构建组件树,整体的 ...
- Delphi 停靠技术的应用
一.基础知识介绍 1.VCL组件的基础知识 在TWinControl类中有一个DockSite属性(boolean),它的作用是是否允许别的控件停靠在它的上面:在TControl类中有一个DragKi ...
- phpcms v9使用GET调用指定id文章内容、页面数据方法
不知道大家有没有相同的体会?在使用Phpcms V9建站调用数据的时候,基础的数据用默认的模板的调用语句就好了,但复杂不常见的数据怎么调用呢?我们技术可能会研究半天,怀着探索的精神不断尝试.孜孜不倦. ...
- git 基础命令
1.git init git 初始化仓库 2.git add . git 添加全部文件 3.git add xxx.txt git 添加单独文件 4.git commit -m "提交的 ...
- LightOj_1274 Beating the Dataset
题目链接 题意: 给一个文档, 这个文档由yes .no 组成, 共有s个byte, 共有n个yes.no. 假设yes的个数为yes_num, no的个数为no_num. 将这n个数进行排列, 对于 ...
- Spring 中设置依赖注入
package com.ysq.vo; public class User { private int uid; private String uname; private String pwd; p ...