一天,你们wyh学长和你们zhl学长玩一个游戏,这个游戏规则是这样的

给你n个城市,保证这n个城市之间都只有一条道路可以到达。

有一件物品,在所有城市中都是一样的,但是由于各个城市的经济发展不同,导致每个城市对于这件物品销售的价格不同。

游戏一共进行Q轮。

每轮给你2个点s和t,其中s代表起点,t代表终点。

对于每一个城市都可以选择买这个物品,如果手里有这个物品的话,也可以选择卖掉这个物品,对于同一个城市来说,买和卖的价格是一样的,每一个城市只能买一件物品

现在,你们wyh学长和zhl学长都需要找到一个方案,使得从起点走到终点的时候盈利最多,请你帮助帮助他们吧。

(题意巨坑, 要求一条路径只能买卖一次。。。)

思路:离线, 利用tarjan离线求lca 的思想, 利用并查集维护链上的最大值, 最小值, 上升时的最大差值, 下降时的最大差值, 对于一个s, t的询问

当dfs回溯到 lca = lca(s, t) 的时候s 到 lca 和 t 到 lca 的最大值, 最小值, 上升时的最大差值, 下降时的最大差值都已经知道啦,然后就能更新答案啦。

 #include<bits/stdc++.h>
#define LL long long
#define fi first
#define se second
#define mk make_pair
#define pii pair<int,int>
using namespace std; const int N = 1e5 + ;
const int M = + ;
const int inf = 0x3f3f3f3f;
const LL INF = 0x3f3f3f3f3f3f3f3f;
const int mod = 1e9 + ; int n, m, mn[N], mx[N], up[N], down[N], ans[N], fa[N]; bool vis[N]; struct Qus {
int s, t, id;
}; vector<Qus> qus[N];
vector<pii> Q[N];
vector<int> edge[N]; int Find(int x) {
if(fa[x] == x)
return x;
int root = Find(fa[x]);
up[x] = max(max(up[x], up[fa[x]]), mx[fa[x]] - mn[x]);
down[x] = max(max(down[x], down[fa[x]]), mx[x] - mn[fa[x]]);
mn[x] = min(mn[x], mn[fa[x]]);
mx[x] = max(mx[x], mx[fa[x]]);
return fa[x] = root;
} void dfs(int u) {
vis[u] = true;
for(pii v : Q[u]) {
if(vis[v.fi]) {
int lca = Find(v.fi);
if(v.se > ) {
qus[lca].push_back({u, v.fi, v.se});
} else {
qus[lca].push_back({v.fi, u, -v.se});
}
}
} for(int v : edge[u]) {
if(!vis[v]) {
dfs(v);
fa[v] = u;
}
} for(Qus now : qus[u]) {
int x = now.s, y = now.t, id = now.id;
Find(x); Find(y);
ans[id] = max(mx[y] - mn[x], max(up[x], down[y]));
}
}
int main() { scanf("%d", &n); for(int i = ; i <= n; i++) {
int w; scanf("%d", &w);
mn[i] = mx[i] = w;
fa[i] = i;
} for(int i = ; i < n; i++) {
int u, v; scanf("%d%d", &u, &v);
edge[u].push_back(v);
edge[v].push_back(u);
} scanf("%d", &m);
for(int i = ; i <= m; i++) {
int s, t; scanf("%d%d", &s, &t);
Q[s].push_back(mk(t, i));
Q[t].push_back(mk(s, -i));
} dfs(); for(int i = ; i <= m; i++) {
printf("%d\n", ans[i]);
}
return ;
} /*
*/

2018年东北农业大学春季校赛 C-wyh的商机的更多相关文章

  1. 2018年东北农业大学春季校赛 K wyh的数列【数论/斐波那契数列大数取模/循环节】

    链接:https://www.nowcoder.com/acm/contest/93/K来源:牛客网 题目描述 wyh学长特别喜欢斐波那契数列,F(0)=0,F(1)=1,F(n)=F(n-1)+F( ...

  2. 2018年东北农业大学春季校赛 I wyh的物品【01分数规划/二分】

    链接:https://www.nowcoder.com/acm/contest/93/I来源:牛客网 题目描述 wyh学长现在手里有n个物品,这n个物品的重量和价值都告诉你,然后现在让你从中选取k个, ...

  3. 2018年东北农业大学春季校赛 F wyh的集合【思维】

    链接:https://www.nowcoder.com/acm/contest/93/F来源:牛客网 题目描述 你们wyh学长给你n个点,让你分成2个集合,然后让你将这n个点进行两两连接在一起,连接规 ...

  4. 2018年东北农业大学春季校赛 D wyh的迷宫【搜索】

    链接:https://www.nowcoder.com/acm/contest/93/D来源:牛客网 题目描述 给你一个n*m的迷宫,这个迷宫中有以下几个标识: s代表起点 t代表终点 x代表障碍物 ...

  5. 2018年东北农业大学春季校赛 B wyh的矩阵【找规律】

    链接:https://www.nowcoder.com/acm/contest/93/B来源:牛客网 题目描述 给你一个n*n矩阵,按照顺序填入1到n*n的数,例如n=5,该矩阵如下 1 2 3 4 ...

  6. 2018年东北农业大学春季校赛 E wyh的集合 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/93/F 思路 其实容易知道在两个不同集合里 假设元素个数 分别为 a b 然后对于第一个集合里的每一个元素 都可以 ...

  7. 2018年东北农业大学春季校赛 E wyh的阶乘 【数学】

    题目链接 https://www.nowcoder.com/acm/contest/93/E 思路 其实就是找阶乘的项中5的个数 末尾为什么会出现0 因为存在5的倍数和偶数相乘 有0存在 借鉴 htt ...

  8. 2018年东北农业大学春季校赛 D wyh的迷宫 【BFS】

    题目链接 https://www.nowcoder.com/acm/contest/93/D 思路 BFS模板题 AC代码 #include <cstdio> #include <c ...

  9. 2018年东北农业大学春季校赛 B wyh的矩阵【规律】

    题目链接 https://www.nowcoder.com/acm/contest/93/B 思路 先加入 中间的那行 和中间的那列 再减去 最中间那个数 因为它 加了两次 然后逐行往下加 会发现是一 ...

  10. 2018年东北农业大学春季校赛-wyh的吃鸡

    BFS: 1. 从起点开始BFS,遇到X点则return: 2. vis[px][py][0]代表经过pxpy这点前还没有找到车: vis[px][py][1]代表经过pxpy这点前已经找到车: 3. ...

随机推荐

  1. oracle 配置本地Net服务

    1.查看当前数据库名字(前提是已经创建了),先前忘记数据库实例名乱输,然后创建一直失败 开始,程序,Oracle_xxxx_home1 ,配置和移植工具, Database Configuration ...

  2. Build CRUD Application with jQuery EasyUI

    http://www.jeasyui.com/tutorial/app/crud.php It has become a common necessily for web application to ...

  3. linux中eth0原何变成了eth1

    Linux的网卡由eth0变成了eth1,如何修复使用wmware安装了linux,安装成功后,使用的网卡是eth0,没有eth1.但是用过一段时间后,不知道为什么eth0无法使用,系统却自动生成了e ...

  4. 用yaml来编写配置文件

    yaml是一个数据序列化的标准,适用于所有开发语言,最大的特点是可读性好. yaml的一个主要应用方向就是编写配置文件,有非常多的系统和框架采用yaml进行配置. yaml有以下基本规则: 1.大小写 ...

  5. 图解MySQL 内连接、外连接

    2.内连接(INNER JOIN)内连接(INNER JOIN):有两种,显式的和隐式的,返回连接表中符合连接条件和查询条件的数据行.(所谓的链接表就是数据库在做查询形成的中间表).例如:下面的语句3 ...

  6. 接口测试Case之面向页面对象编写规范

    一.什么是页面对象化 主要提倡的思想是:万物皆对象,即把一个Page看成一个对象,来进行接口自动化Case的编写,不要闲扯,直接讲怎么个操作法呢? 二.有什么优势? 2.1 Case层次清晰,便于管理 ...

  7. 英文写作指南——《“compare to”等同“compare with”吗?》

  8. CS229 笔记03

    CS229 笔记03 局部加权线性回归 Non-Parametric Learning Algorithm (非参数学习方法) Number of parameters grows with the ...

  9. 春夏秋冬又一春之Redis持久化

    历史文章推荐: 一只准程序猿的唠叨 可能是最漂亮的Spring事务管理详解 Java多线程学习(八)线程池与Executor 框架 面试中关于Redis的问题看这篇就够了 非常感谢<redis实 ...

  10. Oracle中Inventory目录作用以及如何重建此目录 oraInst.loc 文件

    inventory 英 [ˈɪnvəntri] 美 [ˈɪnvəntɔ:ri] n. 清查; 存货清单; 财产目录,财产目录的编制; 存货总值; vt. 盘存; 编制…的目录; 开列…的清单; 总结 ...