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 ...
随机推荐
- (转)Intellij IDEA 2017 debug断点调试技巧与总结详解篇
背景:详细介绍idea的debug调试过程 Intellij IDEA 2017 debug断点调试技巧与总结详解篇
- springboot2.0以后的junit
只需要引入: <dependency> <groupId>junit</groupId> <artifactId>junit</artifactI ...
- PHP- 如何在终端输出带颜色的字体?
转自: http://www.neatstudio.com/show-2568-1.shtml 终端显示颜色,在以前的想法当中,都是因为有了.profile的配色方案.而我一般也都是 采用默认的(sn ...
- 【题解】Luogu P5361 [SDOI2019]热闹又尴尬的聚会
原题传送门 构造题. 明显p,q都越大越好 我们考虑每次取出度最小的点,加到尴尬聚会的集合中(因为把与它相邻的点全删了,不珂能出现认识的情况),把它自己和与自己相连的点从图上删掉(边也删掉),记下这个 ...
- 在PHP中使用UUID扩展的函数
环境:CentOS Linux release 7.7.1908 (Core)PHP 7.3.11UUID Extention 1.0.4 感觉上PHP对UUID的支持似乎不是很上心,PECL中的UU ...
- mysql执行出错:Table 'k_user' is read only
执行sql的时候发现出错 Table 'k_user' is read only 1.给mysql权限 chmod 777 mysql 2.执行一下命令 mysqladmin -uroot -p re ...
- 对于解决VS2015启动界面卡在白屏的处理方法
有时候会遇到这种情况,仅供参考 找到devenv.exe所在文件夹,按住Shift,在空白地方右键,选择“在此处打开命令窗口”,在打开的窗口中输入devenv /ResetSettings 重新设置V ...
- C#实现RSA加密解密
RSA介绍 RSA公钥加密算法是1977年由Ron Rivest、Adi Shamirh和LenAdleman在(美国麻省理工学院)开发的。RSA取名来自开发他们三者的名字。 RSA的缺点: 产生密钥 ...
- 在IOS10系统中无法定位问题
果是非https网页,在http协议下通过html5原生定位接口会返回错误,也就是无法正常定位到用户的具体位置,而已经支持https的网站则不会受影响. 目前提供的解决方案: 1.将网站的http设置 ...
- MVC的Views中使用递归生成Html【转】
在开发过程中往往会有一个需求,就是将一个树状的数据结构在视图中表示出来.例如最传统的多级分类,系统中有一系列根分类,每个分类中又带有一些子分类,而我们的目标便是在页面上生成一个由ul和li嵌套组成的H ...