题意:给定一个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 ;
}

最新文章

  1. RMAN备份脚本一列分享
  2. 实现Redis的主从复制配置
  3. venus java高并发框架
  4. Oracle 事务
  5. 【Apache运维基础(5)】Apache的Rewrite攻略(2)
  6. SICP 习题 (1.7) 解题总结
  7. zoj 1967 Fiber Network/poj 2570
  8. 2W/月和1W/月的工作,你会怎么选?
  9. File的文件提取的小练习
  10. bzoj3875
  11. Java设计模式01:设计模式的 分类 和 设计原则
  12. 安装mysql的遇到的问题
  13. table详解
  14. 《JAVASCRIPT高级程序设计》Ajax与Comet
  15. C# 使用 GDI+ 实现添加中心旋转(任意角度)的文字
  16. TreeMap就这么简单【源码剖析】
  17. iPhone 系统刷机
  18. 理解OpenShift(7):基于 Prometheus 的集群监控
  19. centos6.8 yum安装mysql 5.6 (完整)
  20. P2044 [NOI2012]随机数生成器

热门文章

  1. css3 rotateY 会盖住下面的元素
  2. 【手写代码】快速计算数字x有多少个二进制1
  3. 移动端自适应rem的设置
  4. C#:蓝牙串口读数据和写数据
  5. 【题解】Luogu P5288 [HNOI2019]多边形
  6. Linux文件比对,批量复制
  7. Net实现阿里云开放云存储服务(OSS)
  8. vue+element 通过ref修改一切硬核样式~
  9. MySQL CentOS7 手动安装
  10. shell EOF 用户自定义终止符