时间限制: 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. 消除热块(hot block)

    上篇日志提到了,那么高的负载,是存在数据块读竞争,下面介绍几个方法来消除块竟争 查找块竟争 SELECT p1 "file#", p2 "block#", p3 ...

  2. 删除svn密码方法

    很多时候使用svn,我们需要切换svn账号,但是由于之前的账号已经选择了记住密码,那么我们应该如何删除svn密码来切换新的svn账号呢? 其实很简单,svn账号密码信息保存在电脑某一文件中,我们只要删 ...

  3. 【POJ1707】【伯努利数】Sum of powers

    Description A young schoolboy would like to calculate the sum for some fixed natural k and different ...

  4. nau8822 codec driver 录音时mic bias 无法自动打开问题

    nau8822 codec driver 录音时mic bias 无法自动打开问题 问题描述: kernel版本:3.10 在nuc970上测试nau8822驱动时发现,虽然驱动中有如下定义: SND ...

  5. Java学习----日期函数

    Date   Calendar public class TestDate { private Date date; Calendar calendar; public TestDate() { // ...

  6. ubuntu14.04安装wine以及国际版QQ

    公社(http://www.linuxidc.com/linux/2014-06/103768.htm)说: Wine (“Wine Is Not an Emulator” 的首字母缩写)是一个能够在 ...

  7. 实用lsof常用命令行

    1, 使用 lsof 命令行列出所有打开的文件 # lsof 这可是一个很长的列表,包括打开的文件和网络 上述屏幕截图中包含很多列,例如 PID.user.FD 和 TYPE 等等. FD - Fil ...

  8. linux安装python使用的MySQLdb

    安装mysqldb模块需已安装mysql 使用pip安装MySQLdb pip install mysql-python mac os安装mysqldb sudo pip install mysql- ...

  9. Java: 实现顺序表和单链表的快速排序

    快速排序 快速排序原理 快速排序(Quick Sort)的基本思想是,通过一趟排序将待排记录分割成独立的两部分,其中一部分记录的关键字均比另一部分记录的关键字小,则可对这两部分记录继续进行排序,以达到 ...

  10. Mvc Model 模板的获取【学习笔记】

    MVC的Model模板有两种:一种编辑模式(@Html.EditorFor()).一种显示模式(Html.DisplayFor()). 模板的获取与执行(以下转自这里): 当我们调用HtmlHelpe ...