POJ - 3728:The merchant (Tarjan 带权并查集)
题意:给定一个N个节点的树,1<=N<=50000 每个节点都有一个权值,代表商品在这个节点的价格。商人从某个节点a移动到节点b,且只能购买并出售一次商品,问最多可以产生多大的利润。
思路:路径压缩,得到每个点到当前根的信息,然后更新即可。 有可以用倍增做。
很久前抄的代码。
#include<cstdio>
#define min(a,b) (a<b?a:b)
#define max(a,b) (a>b?a:b)
#define swap(a,b) (a^=b,b^=a,a^=b)
using namespace std;
const int mm=;
const int mn=;
int s[mm],t[mm],d[mm],p[mm],ans[mm];
int h[mn]={},q[mn]={},g[mn]={},f[mn],mx[mn],mi[mn],up[mn]={},dw[mn]={};
bool vis[mn]={};
int i,j,k,n,m,e;
inline void add(int u,int v,int c,int h[])
{
s[e]=u,t[e]=v,d[e]=c,p[e]=h[u],h[u]=e++;
s[e]=v,t[e]=u,d[e]=-c,p[e]=h[v],h[v]=e++;
}
int find(int x)
{
if(f[x]==x)return x;
int y=f[x];
f[x]=find(f[x]);
up[x]=max(mx[y]-mi[x],max(up[x],up[y]));
dw[x]=max(mx[x]-mi[y],max(dw[x],dw[y]));
mx[x]=max(mx[x],mx[y]);
mi[x]=min(mi[x],mi[y]);
return f[x];
}
void tarjan(int u)
{
int i,v,x,y;
vis[f[u]=u]=;
for(i=q[u];i;i=p[i])
if(vis[v=t[i]])
v=find(v),t[e]=i,p[e]=g[v],g[v]=e++;
for(i=h[u];i;i=p[i])
if(!vis[v=t[i]])tarjan(v),f[v]=u;
for(i=g[u];i;i=p[i])
{
v=t[i],x=s[v],y=t[v],find(x);
if(d[v]<)swap(x,y),v=-d[v];
else v=d[v];
ans[v]=max(mx[y]-mi[x],max(up[x],dw[y]));
}
}
inline void get(int &a)
{
char c;
while((c=getchar())<''||c>'');
for(a=;c>=''&&c<='';c=getchar())a=a*+c-'';
}
void out(int x)
{
if(x>)out(x/);
putchar(x%+'');
}
int main()
{
for(get(n),i=; i<=n; ++i)get(mx[i]),mi[i]=mx[i];
for(e=k=; k<n; ++k)get(i),get(j),add(i,j,,h);
for(get(m),k=; k<=m; ++k)get(i),get(j),add(i,j,k,q);
tarjan();
for(i=; i<=m; ++i)out(ans[i]),puts("");
return ;
}
POJ - 3728:The merchant (Tarjan 带权并查集)的更多相关文章
- POJ 1988 Cube Stacking( 带权并查集 )*
POJ 1988 Cube Stacking( 带权并查集 ) 非常棒的一道题!借鉴"找回失去的"博客 链接:传送门 题意: P次查询,每次查询有两种: M x y 将包含x的集合 ...
- poj 1733 Parity game(带权并查集+离散化)
题目链接:http://poj.org/problem?id=1733 题目大意:有一个很长很长含有01的字符串,长度可达1000000000,首先告诉你字符串的长度n,再给一个m,表示给你m条信息, ...
- POJ 1733 Parity game(离散化+带权并查集)
离散化+带权并查集 题意:长度为n的0和1组成的字符串,然后问第L和R位置之间有奇数个1还是偶数个1. 根据这些回答, 判断第几个是错误(和之前有矛盾)的. 思路:此题同HDU 3038 差不多,询问 ...
- POJ 1988 Cube Stacking 【带权并查集】
<题目链接> 题目大意: 有几个stack,初始里面有一个cube.支持两种操作: 1.move x y: 将x所在的stack移动到y所在stack的顶部. 2.count x:数在x所 ...
- POJ 1733 Parity game 【带权并查集】+【离散化】
<题目链接> 题目大意: 一个由0,1组成的序列,每次给出一段区间的奇偶,问哪一条信息不合法. 解题分析: 我们用s[i]表示前i个数的前缀和,那么a b even意味着s[b]和s[a- ...
- poj 1984 Navigation Nightmare(带权并查集+小小的技巧)
题目链接:http://poj.org/problem?id=1984 题意:题目是说给你n个线,并告知其方向,然后对于后面有一些询问,每个询问有一个时间点,要求你输出在该时间点a,b的笛卡尔距离,如 ...
- POJ 1182 食物链 (经典带权并查集)
第三次复习了,最经典的并查集 题意:动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1-N编号.每个动物都是A,B,C中的一种,但是我们 ...
- POJ 2912 - Rochambeau - [暴力枚举+带权并查集]
题目链接:http://poj.org/problem?id=2912 Time Limit: 5000MS Memory Limit: 65536K Description N children a ...
- POJ:1182 食物链(带权并查集)
http://poj.org/problem?id=1182 Description 动物王国中有三类动物A,B,C,这三类动物的食物链构成了有趣的环形.A吃B, B吃C,C吃A. 现有N个动物,以1 ...
随机推荐
- Git 配置环境
安装 在Fedora/CentOS下安装 $ sudo yum install git 在Debian/Ubuntu Linux下载安装 $ sudo apt-get install git Wind ...
- 《ucore lab1 exercise4》实验报告
资源 ucore在线实验指导书 我的ucore实验代码 题目:分析bootloader加载ELF格式的OS的过程 通过阅读bootmain.c,了解bootloader如何加载ELF文件.通过分析源代 ...
- [转帖]NSA武器库知识整理
NSA武器库知识整理 https://www.cnblogs.com/FrostDeng/p/7120812.html 美国国家安全局(NSA)旗下的“方程式黑客组织”(shadow brokers) ...
- spring的exception
Springmvc的对于异常类进行统一处理的方法 一.局部异常统一处理 当异常出现时,将抛给异常处理方法,异常处理发放接收到异常数据,进行处理,统一到异常页面 @ExceptionHandler:通过 ...
- Vim 入门
Vim 简介 打开 Vim的四种模式 一些命令 插入 移动 文件 编辑 环境设置 .vimrc 更多命令 环境设置 折叠 显示 Vim 简介 Vim 是字符模式下的一种文本编辑器,不需要图形界面,它是 ...
- tp5.1 根据IP地址获取用户所在省市(个人笔记)
class IPAddress extends Common { /** * 根据ip地址,获取用户所在省市 */ public function ipIndex() { $ip = "22 ...
- 如何同时读取 TDateTimePicker 的 Date 和 Time ?
由于 TDateTimePicker 只能用于日期或时间,不能同时使用.如果将Kind属性设置为dtkDate,则可以指定自定义DATE格式,但忽略任何TIME格式,并且Time未定义使用该属性.如果 ...
- python 职责链模式
模式定义 责任链模式(Chain of Responsibility Pattern)为请求创建了一个接收者对象的链. 这种模式给予请求的类型,对请求的发送者和接收者进行解耦. 这种类型的设计模式属于 ...
- Linux目录结构(目录结构详解是重点)
1.Linux目录与Windows目录对比 1.Windows目录结构 2.Linux目录结构 深刻理解Linux 树状文件目录是非常重要的,只有记住他们,你才能在命令行中任意切换,想去哪里去哪里 2 ...
- 用python读取word文件里的表格信息【华为云技术分享】
在企查查查询企业信息的时候,得到了一些word文件,里面有些控股企业的数据放在表格里,需要我们将其提取出来. word文件看起来很复杂,不方便进行结构化.实际上,一个word文档中大概有这么几种类型的 ...