poj3728The merchant
The merchant
| Time Limit: 3000MS | Memory Limit: 65536K | |
| Total Submissions: 4800 | Accepted: 1666 |
Description
There are N cities in a country, and there is one and only one simple path between each pair of cities. A merchant has chosen some paths and wants to earn as much money as possible in each path. When he move along a path, he can choose one city to buy some goods and sell them in a city after it. The goods in all cities are the same but the prices are different. Now your task is to calculate the maximum possible profit on each path.
Input
The first line contains N, the number of cities. Each of the next N lines contains wi the goods' price in each city. Each of the next N-1 lines contains labels of two cities, describing a road between the two cities. The next line contains Q, the number of paths. Each of the next Q lines contains labels of two cities, describing a path. The cities are numbered from 1 to N.
1 ≤ N, wi, Q ≤ 50000
Output
The output contains Q lines, each contains the maximum profit of the corresponding path. If no positive profit can be earned, output 0 instead.
Sample Input
4
1
5
3
2
1 3
3 2
3 4
9
1 2
1 3
1 4
2 3
2 1
2 4
3 1
3 2
3 4
Sample Output
4
2
2
0
0
0
0
2
0
Source
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm> using namespace std; int n,a[],head[],to[],nextt[],tot,q,d[];
int fa[][], minn[][], maxx[][], lmax[][], rmin[][]; void add(int x, int y)
{
to[tot] = y;
nextt[tot] = head[x];
head[x] = tot++;
} void dfs(int u, int from,int dist)
{
d[u] = dist;
fa[u][] = from;
for (int i = head[u]; i != -; i = nextt[i])
{
int v = to[i];
if (from != v)
dfs(v, u,dist + );
}
} void init()
{
dfs(, , );
minn[][] = maxx[][] = a[];
lmax[][] = - << ;
rmin[][] = << ;
for (int i = ; i <= n; i++)
{
minn[i][] = min(a[i], a[fa[i][]]);
maxx[i][] = max(a[i], a[fa[i][]]);
lmax[i][] = max(a[fa[i][]] - a[i], );
rmin[i][] = min(a[fa[i][]] - a[i], );
}
for (int j = ; ( << j) < n; j++)
for (int i = ; i <= n; i++)
{
fa[i][j] = fa[fa[i][j - ]][j - ];
maxx[i][j] = max(maxx[i][j - ], maxx[fa[i][j - ]][j - ]);
minn[i][j] = min(minn[i][j - ], minn[fa[i][j - ]][j - ]);
lmax[i][j] = max(max(lmax[i][j - ], lmax[fa[i][j - ]][j - ]), maxx[fa[i][j-]][j - ] - minn[i][j - ]);
rmin[i][j] = min(min(rmin[i][j - ], rmin[fa[i][j - ]][j - ]), minn[fa[i][j - ]][j - ] - maxx[i][j - ]);
}
} int LCA(int x, int y)
{
int maxxx = , miny = , minx = a[x], maxy = a[y];
for (int i = ; i >= && d[x] != d[y]; i--)
{
if (abs(d[x] - d[y]) >= << i)
{
if (d[y] < d[x])
{
maxxx = max(max(maxxx, lmax[x][i]), maxx[x][i] - minx);
minx = min(minx, minn[x][i]);
x = fa[x][i];
}
else
{
miny = min(min(miny, rmin[y][i]), minn[y][i] - maxy);
maxy = max(maxy, maxx[y][i]);
y = fa[y][i];
}
}
}
if (x == y)
return max(max(maxxx, -miny), maxy - minx);
for (int i = ; i >= ;i--)
if (fa[x][i] != fa[y][i] && fa[x][i] && fa[y][i])
{
maxxx = max(max(maxxx, lmax[x][i]), maxx[x][i] - minx);
minx = min(minx, minn[x][i]);
x = fa[x][i]; miny = min(min(miny, rmin[y][i]), minn[y][i] - maxy);
maxy = max(maxy, maxx[y][i]);
y = fa[y][i];
}
maxxx = max(max(maxxx, lmax[x][]), maxx[x][] - minx);
minx = min(minx, minn[x][]);
miny = min(min(miny, rmin[y][]), minn[y][] - maxy);
maxy = max(maxy, maxx[y][]);
return max(max(maxxx, -miny), maxy - minx); } int main()
{
memset(head, -, sizeof(head));
scanf("%d", &n);
for (int i = ; i <= n; i++)
scanf("%d", &a[i]);
for (int i = ; i <= n - ; i++)
{
int u, v;
scanf("%d%d", &u, &v);
add(u, v);
add(v, u);
}
init();
scanf("%d", &q);
while (q--)
{
int x, y;
scanf("%d%d", &x, &y);
printf("%d\n", LCA(x, y));
} return ;
}
poj3728The merchant的更多相关文章
- poj3728The merchant 【倍增】【LCA】
There are N cities in a country, and there is one and only one simple path between each pair of citi ...
- POJ3728The merchant (倍增)(LCA)(DP)(经典)(||并查集压缩路径?)
There are N cities in a country, and there is one and only one simple path between each pair of citi ...
- poj3728The merchant树剖+线段树
如果直接在一条直线上,那么就建线段树 考虑每一个区间维护最小值和最大值和答案,就符合了合并的条件,一个log轻松做 那么在树上只要套一个树剖就搞定了,多一个log也不是问题 注意考虑在树上的话每一条链 ...
- [最近公共祖先] POJ 3728 The merchant
The merchant Time Limit: 3000MS Memory Limit: 65536K Total Submissions: 4556 Accepted: 1576 Desc ...
- POJ 3278 The merchant
传送门 Time Limit: 3000MS Memory Limit: 65536K Description There are N cities in a country, and there i ...
- poj 3728 The merchant(LCA)
Description There are N cities in a country, and there is one and only one simple path between each ...
- ThoughtWorks Merchant's Guide To The Galaxy
ThoughtWorks笔试题之Merchant's Guide To The Galaxy解析 一.背景 在某网站上看到ThoughtWorks在武汉招人,待遇在本地还算不错,就投递了简历.第二天H ...
- [POJ 3728]The merchant
Description There are N cities in a country, and there is one and only one simple path between each ...
- opencart3图片Google Merchant Center验证通过不了的解决方法
最近在做一个opencart项目,有对接Google Merchant Center,但是一直提示产品图片验证无法通过,ytkah看了一下图片路径,/image/cache/catalog/demo/ ...
随机推荐
- [大坑]Could not create cudnn handle: CUDNN_STATUS_INTERNAL_ERROR
报错tensorflow/stream_executor/cuda/cuda_dnn.cc:338] Could not create cudnn handle: CUDNN_STATUS_INTER ...
- [课堂总结]C++课堂总结(二)
近期的面向对象程序设计的不容易记忆或者理解的东西进行一个总结,以后忘记了可以常来看下,C++是个很重要的东西,很多领域都用得到,加油,特种兵! 浅拷贝构造.深拷贝构造 浅拷贝构造是系统默认的拷贝构造函 ...
- MFC:DISP_FUNCTION 参数
/*#include <afxdisp.h>DISP_FUNCTION( theClass, pszName, pfnMember, vtRetVal, vtsParams )参数:the ...
- python之生成器的初识
1. 生成器的定义 生成器的本质就是迭代器.python社区生成器和迭代器是一种 2. 生成器和迭代器区别 迭代器: 都是Python给你提供的已经写好的工具或者通过数据转化得来的 生成器: ...
- Mybatis中关于OGNL表达式冲突
注意设计表字段不能用bor xor and band eq neq lt gt lte gte shl shr ushr
- Python中文编码问题(字符串前面加'u')
中文编码问题是用中文的程序员经常头大的问题,在python下也是如此,那么应该怎么理解和解决python的编码问题呢? 我们要知道python内部使用的是unicode编码,而外部却要面对千奇百怪的各 ...
- Python——函数基础
函数是什么 它相当于一个独立的代码块,可以被重复使用,如果需要增加一个功能或者修改一个功能,只需要,增加或者修改函数即可. 函数分类 内置函数 python解释器已经为我们定义好的参数,比如:len( ...
- ssh整合思想 Spring与Hibernate和Struts2的action整合 调用action添加数据库 使用HibernateTemplate的save(entity)方法 update delete get 等方法crud操作
UserAction类代码: package com.swift.action; import com.opensymphony.xwork2.ActionSupport; import com.sw ...
- ASP( VBScript ) 解析 JSON
<script language="jscript" runat="server"> Array.prototype.get = function( ...
- 【android】6大布局
线性布局 相对布局 绝对布局 网格布局 表格布局 帧布局