http://codevs.cn/problem/3305/

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

维护树上信息,包括 从儿子到自己的 最大值 最小值,从上到下的最优解,从下到上的最优解

倍增 LCA 向上完成信息的Up   真滴恶心

 #include <cstdio>

 using namespace std;

 const int INF();
const int N(+);
int n,m,u,v,pri[N],ans; int head[N],sumedge;
struct Edge
{
int v,next;
Edge(int v=,int next=): v(v),next(next){}
}edge[N<<];
void ins(int u,int v)
{
edge[++sumedge]=Edge(v,head[u]);
head[u]=sumedge;
} #define swap(a,b) {int temp=a;a=b;b=temp;}
#define max(a,b) (a>b?a:b)
#define min(a,b) (a<b?a:b) struct Node
{
int dad,maxx,minn,up_down,down_up;
}shop[N][];
int deep[N],maxx,minn,lca;
void DFS(int x,int fa)
{
deep[x]=deep[fa]+;
shop[x][].maxx=max(pri[x],pri[fa]);
shop[x][].minn=min(pri[x],pri[fa]);
shop[x][].down_up=max(,pri[fa]-pri[x]);
shop[x][].up_down=max(,pri[x]-pri[fa]);
for(int i=;shop[x][i-].dad;i++)
{
shop[x][i].dad=shop[shop[x][i-].dad][i-].dad;
shop[x][i].maxx=max(shop[x][i-].maxx,shop[shop[x][i-].dad][i-].maxx);
shop[x][i].minn=min(shop[x][i-].minn,shop[shop[x][i-].dad][i-].minn);
shop[x][i].down_up=max(shop[x][i-].down_up,shop[shop[x][i-].dad][i-].down_up);
shop[x][i].down_up=max(shop[x][i].down_up,shop[shop[x][i-].dad][i-].maxx-shop[x][i-].minn);
shop[x][i].up_down=max(shop[x][i-].up_down,shop[shop[x][i-].dad][i-].up_down);
shop[x][i].up_down=max(shop[x][i].up_down,shop[x][i-].maxx-shop[shop[x][i-].dad][i-].minn);
}
for(int i=head[x];i;i=edge[i].next)
{
int v=edge[i].v;
if(shop[x][].dad!=v) shop[v][].dad=x,DFS(v,x);
}
} int LCA(int x,int y)
{
if(deep[x]>deep[y]) swap(x,y);
for(int i=;i>=;i--)
if(deep[shop[y][i].dad]>=deep[x]) y=shop[y][i].dad;
if(x==y) return x;
for(int i=;i>=;i--)
if(shop[x][i].dad!=shop[y][i].dad) x=shop[x][i].dad,y=shop[y][i].dad;
return shop[x][].dad;
}
/*Node Query(int u,int v)
{
Node ret;
ret.minn=1e9,ret.maxx=-23333,ret.up_down=-23333,ret.down_up=-23333;
for(int i=20;i>=0;i--)
if(deep[shop[u][i].dad]>=deep[v])
{
ret.minn=min(shop[u][i].minn,ret.minn);
ret.maxx=max(shop[u][i].maxx,ret.maxx);
ret.up_down=max(ret.up_down,shop[u][i].maxx-ret.minn);
ret.down_up=max(ret.down_up,ret.maxx-shop[u][i].minn);
u=shop[u][i].dad;
}
minx=ret.minn; maxx=ret.maxx;
return ret;
}*/
int Query(int u,int v)
{
ans=; minn=INF;maxx=-INF;
lca=LCA(u,v);
int dep1=deep[u]-deep[lca];
if(dep1>)
for(int i=;i>=;i--)
if(dep1&(<<i))
{
ans=max(ans,max(shop[u][i].down_up,shop[u][i].maxx-minn));
minn=min(minn,shop[u][i].minn);
u=shop[u][i].dad;
}
int dep2=deep[v]-deep[lca];
if(dep2>)
{
for(int i=;i>=;i--)
if(dep2&(<<i))
{
ans=max(ans,max(shop[v][i].up_down,maxx-shop[v][i].minn));
maxx=max(maxx,shop[v][i].maxx);
v=shop[v][i].dad;
}
}
return max(ans,maxx-minn);
} int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&pri[i]);
for(int i=;i<n;i++)
{
scanf("%d%d",&u,&v);
ins(u,v); ins(v,u);
}
DFS(,);
scanf("%d",&m);
for(;m--;)
{
scanf("%d%d",&u,&v);
if(u==v) puts("");
else
{
/*minx=1e9,maxx=-1e9,ans=-2333333,lca=LCA(u,v);
int dep1=deep[u]-deep[lca];
int dep2=deep[v]-deep[lca];
if(dep1>0) ans=max(ans,Query(u,lca).down_up);
else ans=max(ans,Query(lca,u).up_down);
if(dep2>0) ans=max(ans,Query(v,lca).down_up);
else ans=max(ans,Query(lca,v).up_down);
ans=max(ans,maxx-minx);*/
printf("%d\n",Query(u,v));
}
}
return ;
}

CodeVs——T 3305 水果姐逛水果街Ⅱ的更多相关文章

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

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

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

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

  3. Codevs 3305 水果姐逛水果街Ⅱ 倍增LCA

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

  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. 如何建立远程桌面连接(XP、Vista、Win7)

    如何建立远程桌面连接(XP.Vista.Win7) 要求: 1:对方即你要连的机器必须要允许远程桌面连接,操作系统一般是winXP(单用户)和win2003server(多用户),具体设置:右击我的电 ...

  2. phantomjs 设置代理

    phantomjs 可通过以下设置代理ip #coding=utf-8import osimport reimport timeimport requestsfrom scrapy.selector ...

  3. 【js基础】判断是否是合法邮箱地址(正则表达式的应用)

    2019-01-21 09:11:21 <!DOCTYPE html> <html> <head> <meta charset="utf-8&quo ...

  4. java之JMX

    java之JMX 有关JMX的定义和架构就不具体解释了.见百度百科: http://baike.baidu.com/link? url=6QzGGEqphTmpft3ll5mXmDNVRdvLRZhk ...

  5. QTP校验数据库中数据后台项目

    数据校验功能后台主要包含两个类:QTPCommonServlet.java和QTPCommonDao.java 当中QTPCommonServlet.java为: package com.runqia ...

  6. HDU 1429 胜利大逃亡(续)(bfs)

    胜利大逃亡(续) Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total S ...

  7. 关于jquery的事件命名空间

    在多人协作的前端开发中,或许会遇到一个问题:几个开发人员都给一个元素添加了同样的事件,但是又有开发人员想要解除掉元素身上的某个事件效果,这时候操作起来就有些麻烦,需要用到jquery给我们提供的事件命 ...

  8. Fragment-两种使用方式

    这篇我们就用实例来看看我们在代码中如何使用Fragment 一:静态添加Fragment 新建一个项目,添加两个Fragment的布局文件fragment_title,fragment_content ...

  9. Kinect 开发 —— 硬件设备解剖

    Kinect for Xbox: 360 不支持“近景模式” 三只眼睛 —— 红外投影机,RGB摄像头,红外深度投影头  —— 色彩影像中的每个像素分别与深度影像中的一个像素对应 四只耳朵 —— L形 ...

  10. hdu2768Cat vs. Dog (反建法,最大独立集)

    Cat vs. Dog Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total S ...