时间限制: 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

 
题解:
和3304同理,改为树上倍增即可。
处理信息特别麻烦。。。
 
代码略丑。。。
 #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的更多相关文章

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

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

  2. code vs 3305 水果姐逛水果街Ⅱ

    3305 水果姐逛水果街Ⅱ  时间限制: 2 s  空间限制: 256000 KB  题目等级 : 钻石 Diamond 题解       题目描述 Description 水果姐第二天心情也很不错, ...

  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. Codevs 3304 水果姐逛水果街Ⅰ 线段树

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

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

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

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

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

  8. codevs3305 水果姐逛水果街Ⅱ

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

  9. codevs3304 水果姐逛水果街

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

随机推荐

  1. 什么是WordPress?

    (今天由于好友 肖知虎的 的需求 , 我开始了帮助小虎建站的需求, 就这样开始学习了Wordpress.  这些文章就是为了记录这些我在学习过程当中的心得,和记录下来的文字而已) 什么是WordPre ...

  2. 初学HTML5系列二:HTML5新增的事件属性

    Window事件属性: 属性 值 描述 onafterprint  script 文档打印之后运行的脚本. 属性发生于用户设置页面打印并且打印对话框已出现之后. onbeforeprint  scri ...

  3. maven 创建的符号连接命令

    E:\Joyplus\src\main\webapp\WEB-INF>mklink /d lib ..\..\..\.\..\target\ediHelperSuite-0.5\WEB-INF\ ...

  4. 2014年10月30日-----SQL的基础知识

    数据库的概念 结构化查询语言:structured query language 简称:SQL 数据库管理系统:database management system 简称:DBMS 数据库管理员:da ...

  5. GridView 编辑、删除 、分页

    类似代码都差不多,记录一下,便于以后查看使用. 前台页面: <asp:GridView ID="gdvList" runat="server" AutoG ...

  6. ie8中parseInt字符型数值转换数值型问题

    今天在ie8中测试项目发现一个奇怪的问题,"08" "09" 强转竟然变成了: 后来发现ie8把"08" "09" 默认 ...

  7. JavaWeb学习----JSP简介及入门(JSP结构及JSP处理)

    ​[声明] 欢迎转载,但请保留文章原始出处→_→ 艾水及水:http://www.cnblogs.com/liuhepeng 文章来源:http://www.cnblogs.com/liuhepeng ...

  8. Java设计模式(学习整理)---适配模式

    设计模式之Adapter(适配器) 1.定义: 将两个不兼容的类纠合在一起使用,属于结构型模式,需要有Adaptee(被适配者)和Adaptor(适配器)两个身份. 2.为何使用? 我们经常碰到要将两 ...

  9. Java虚拟机类加载初始化解析

    Classloader的作用,概括来说就是将编译后的class装载.加载到机器内存中,为了以后的程序的执行提供前提条件. 一段程序引发的思考: 风中叶老师在他的视频中给了我们一段程序,号称是世界上所有 ...

  10. mysql 刘道成视频教程1、2课----------大致结构

    第1课 第2课 一.整体结构 1.mysql -h localhost -u root -p *** 如果-h不写,则默认连接localhost. 2.连接服务器成功,-------> 显示数据 ...