时间限制: 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. doj常用包

    dojo.raise               抛出一个异常 dojo.errorToString将异常转换为字符串 dojo.render      系统环境对象 dojo.hostenv. ...

  2. delphi 编写一个dos 窗体

    + //dos 仿真程序 delphi 窗体实现!   function GetDosOutput(CommandLine: string; Work: string = 'C:\'): string ...

  3. 水题(素数表)NYOJ素数距离

                描述 现在给出你一些数,要求你写出一个程序,输出这些整数相邻最近的素数,并输出其相距长度.如果左右有等距离长度素数,则输出左侧的值及相应距离. 如果输入的整数本身就是素数,则输 ...

  4. 一个由IsPrime算法引发的细节问题

    //******************************* // //    2014年9月18日星期四,于宿舍撰写 //    作者:夏华林 // //******************* ...

  5. mouseover和mouseout事件在鼠标经过子元素时也会触发

    JavaScript的mouseover和mouseout事件,在绑定元素内部有子元素的情况下, 经过绑定元素时会多次触发mouseover和mouseout事件. jQuery解决办法: jquer ...

  6. iOS狂暴之路---iOS的第一个应用中能学到哪些知识

    一.前文回顾 在之前已经介绍了 iOS的学习路线图,因为中间遇到一些Android开发问题,所以就耽搁了一段时间,那么接下来的这段时间我们将继续开始iOS的狂暴之路学习,按照国际惯例,第一个应用当然是 ...

  7. UEditor配置图片上传

    最近项目中需要用到一个图文编辑器功能,因为之前的kingeditor功能过于简陋,所以决定换成Ueditor,前端已经配置好了,这个是后台配置 1,确定前台已经配置好了 2,将编辑器的插件包下载下来, ...

  8. Linux 多用户和多用户边界

    1. 需求背景 2. 多用户的边界: 独立的工作目录 3. 多用户的边界:可操作/访问的资源 4. 多用户的边界: 可执行的操作 5. 多用户的特性标识: UID和GID -------------- ...

  9. 学习Swift--方法

    方法 方法是与某些特定类型相关联的函数.类.结构体.枚举都可以定义实例方法:实例方法为给定类型的实例封装了具体的任务与功能.类.结构体.枚举也可以定义类型方法:类型方法与类型本身相关联.类型方法与 O ...

  10. css:中文词不断开,整体换行

    一.问题   关于文字的换行与不换行的问题有些特殊情况,是使用css的word-break等属性实现不了的,下面的情况就证明了: 我们想要的效果是,一个词整体换行或不换行,“兼职测试”可以都换至第二行 ...