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/ ...
随机推荐
- 结构化查询语言-SQL
结构化查询语言(Structured Query Language)简称SQL(发音:/ˈes kjuː ˈel/ "S-Q-L"),是一种特殊目的的编程语言,是一种数据库查询和程 ...
- Java的数组与内存控制
1 数组基础 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成.其中,每一个数据称作一个数组元素(item),每个数组元素可以通过一个下标/索引来(index)访问它们. 数组 ...
- JS中的作用域和作用域链
本文原链接:https://cloud.tencent.com/developer/article/1403589 前言 作用域(Scope) 1. 什么是作用域 2. 全局作用域和函数作用域 3. ...
- Win10开机启动项
键盘输入:win+r 输入命令:shell:startup
- js中替换字符串
function formatStr(str){ str=str.replace(/\r\n/ig,"<br/>"); return str; } 要注意两点: 要使用 ...
- JTT808、JTT809、JTT796、JTT794、JTT1077、JTT1078区别与交通部道路运输车辆卫星定位系统部标标准大全下载地址
部标JT/T808协议.JT/T809协议.JT/T796标准.JT/T794标准的区别,他们是基于不同的通信场景,不同的通信对象,不同的设计目的和目标而制定出来的.首先要知道这些标准的全称是什么意思 ...
- Oracle SQL语句性能优化方法大全
Oracle SQL语句性能优化方法大全 下面列举一些工作中常常会碰到的Oracle的SQL语句优化方法: 1.SQL语句尽量用大写的: 因为oracle总是先解析SQL语句,把小写的字母转换成大写的 ...
- 03_10_Object类的toString equals等方法
03_10_Object类的toString equals等方法 1. toString方法 Object类中定义有public String toString()方法,其返回值是String类型,描 ...
- BZOJ-1833(数位DP)
#include <bits/stdc++.h> using namespace std; typedef long long ll; ll a,b; int k[20]; ll dp[2 ...
- IntelliJ IDEA 配置 Tomcat 运行web项目
运行前提: 配置好 Java 的运行环境 配置好 Tomcat 安装 IntelliJ IDEA 开始 1.创建项目并配置 关于配置SDK,等建完项目再说 没有配置SDK的话 会出现下面的弹框,点击 ...