问题描述

为了提高智商,ZJY准备去往一个新世界去旅游。这个世界的城市布局像一棵树。每两座城市之间只有一条路径可以互达。每座城市都有一种宝石,有一定的价格。ZJY为了赚取最高利益,她会选择从A城市买入再转手卖到B城市。由于ZJY买宝石时经常卖萌,因而凡是ZJY路过的城市,这座城市的宝石价格会上涨。让我们来算算ZJY旅游完之后能够赚取的最大利润。(如a城市宝石价格为v,则ZJY出售价格也为v)

输入格式

第一行输入一个正整数N,表示城市个数。
接下来一行输入N个正整数表示每座城市宝石的最初价格p。
第三行开始连续输入N-1行,每行有两个数字x和y。表示x城市和y城市有一条路径。城市编号从1开始。
下一行输入一个整数Q,表示询问次数。
接下来Q行,每行输入三个正整数a,b,v,表示ZJY从a旅游到b,城市宝石上涨v。
即是询问a—>b(有方向)间路径上的max(Price[j]−Price[i])) 且j到a的距离比i到a大 。然后把这条路径上所有点的点权+v。

输出格式

对于每次询问,输出ZJY可能获得的最大利润,如果亏本则输出0。

样例输入 1

3
1 2 3
1 2
2 3
2
1 2 100
1 3 100

样例输出 1

1
1

样例输入 2

3
1 2 3
1 3
2 3
2
1 2 100
1 3 100

样例输出 2

2
2

数据范围

1≤ N≤50000, 1≤Q ≤50000,每个宝石的初始价格不超过100


题解

啊啊调了一上午。
原问题实际上是两个操作:修改和求值。
用树剖。修改简单,不讲了。
恶心的是求值,不能简单地求极大值与极小值之差。所以我们要多维护几个东西。LeftDelta[]维护每个区间的极大极小值之差,要求极小值在左。RightDelta[]维护极小值在右的情况。
对于一条路径, “买”和“卖”的点可能在一条重链上,也可能不在。
若在,区间查询时可以处理出来;若不在,记下之前的最小值,对于每条链,用该链的区间最大值减去之前的极小值即是在该链“卖”的最大收益。对于每种情况,取最大值。
具体实现略有不同,见代码。


代码

#include <stdio.h>
#include <cstdio>
#include <algorithm>
#include <iostream>
#define ll long long
using namespace std;
struct dt{ll maxit,minit,ldelta,rdelta;
};
const ll Q=50005;
ll ls[Q<<3],rs[Q<<3],ldel[Q<<3],rdel[Q<<3],lazy[Q<<3],maxn[Q<<3],minn[Q<<3],tot=1;
ll cnt=0,dep[Q],f[Q],si[Q],bs[Q],id[Q],be[Q];
ll n,nn[Q<<1],e[Q<<1],last[Q],inc=0,a[Q];
void add(ll x,ll y)
{e[++inc]=y;nn[inc]=last[x];last[x]=inc;
}
dt get(ll now,ll l,ll r,ll x,ll y,ll v)
{dt t,t1,t2;if(x<=l&&y>=r){t.ldelta=ldel[now],t.rdelta=rdel[now];t.maxit=maxn[now],t.minit=minn[now];lazy[now]+=v;maxn[now]+=v;minn[now]+=v;return t;}t.ldelta=t.rdelta=0;t.minit=1e9;t.maxit=-1e9;ll mid=(l+r)>>1;if(lazy[now]){ll ha=lazy[now];lazy[now]=0;if(!ls[now])ls[now]=++tot;if(!rs[now])rs[now]=++tot;lazy[ls[now]]+=ha;lazy[rs[now]]+=ha;maxn[ls[now]]+=ha;maxn[rs[now]]+=ha;minn[ls[now]]+=ha;minn[rs[now]]+=ha;}if(x<=mid){if(!ls[now])ls[now]=++tot;t1=get(ls[now],l,mid,x,y,v);t.maxit=max(t.maxit,t1.maxit);t.minit=min(t.minit,t1.minit);t.ldelta=max(t.ldelta,t1.ldelta);t.rdelta=max(t.rdelta,t1.rdelta);}if(y>mid){if(!rs[now])rs[now]=++tot;t2=get(rs[now],mid+1,r,x,y,v);t.maxit=max(t.maxit,t2.maxit);t.minit=min(t.minit,t2.minit);t.ldelta=max(t.ldelta,t2.ldelta);t.rdelta=max(t.rdelta,t2.rdelta);}if(x<=mid&&y>mid){t.ldelta=max(t.ldelta,t2.maxit-t1.minit);t.rdelta=max(t.rdelta,t1.maxit-t2.minit);}minn[now]=min(minn[ls[now]],minn[rs[now]]);maxn[now]=max(maxn[ls[now]],maxn[rs[now]]);ldel[now]=max(max(ldel[ls[now]],ldel[rs[now]]),maxn[rs[now]]-minn[ls[now]]);rdel[now]=max(max(rdel[ls[now]],rdel[rs[now]]),maxn[ls[now]]-minn[rs[now]]);return t;
}
void fbc(ll x)
{si[x]=1,bs[x]=0;ll now=0,y,t;for(t=last[x];t;t=nn[t]){y=e[t];if(y==f[x])continue;dep[y]=dep[x]+1,f[y]=x;fbc(y);si[x]+=si[y];if(now<si[y])now=si[y],bs[x]=y;}
}
void cbc(ll x,ll now)
{id[x]=++cnt,be[x]=now;if(bs[x]!=0)cbc(bs[x],now);ll y,t;for(t=last[x];t;t=nn[t]){y=e[t];if(y==f[x]||y==bs[x])continue;cbc(y,y);}
}
int main()
{minn[0]=1e9;ll i,m,x,y;scanf("%lld",&n);for(i=1;i<=n;i++)scanf("%lld",&a[i]);for(i=1;i<n;i++)scanf("%lld%lld",&x,&y),add(x,y),add(y,x);dep[1]=1,f[1]=0;fbc(1);cbc(1,1);for(i=1;i<=n;i++)get(1,1,n,id[i],id[i],a[i]);for(scanf("%lld",&i);i;--i){scanf("%lld%lld%lld",&x,&y,&m);ll ans=0,lmin=1e9,lmax=-1e9,rmin=1e9,rmax=-1e9;dt ha;while(be[x]!=be[y]){if(dep[be[x]]>dep[be[y]]){ha=get(1,1,n,id[be[x]],id[x],m);ans=max(ans,ha.rdelta);lmax=ha.maxit;ans=max(ans,lmax-lmin);lmin=min(lmin,ha.minit);ans=max(ans,rmax-lmin);x=f[be[x]];}else{ha=get(1,1,n,id[be[y]],id[y],m);ans=max(ans,ha.ldelta);rmin=ha.minit;ans=max(ans,rmax-rmin);rmax=max(rmax,ha.maxit);ans=max(ans,rmax-lmin);y=f[be[y]];}}ha=get(1,1,n,min(id[x],id[y]),max(id[x],id[y]),m);if(id[x]<id[y])ans=max(ans,ha.ldelta);else ans=max(ans,ha.rdelta);ans=max(ans,max(rmax-ha.minit,ha.maxit-lmin));printf("%lld\n",ans);}return 0;
}

[TJOI2015]旅游相关推荐

  1. BZOJ3999: [TJOI2015]旅游

    BZOJ3999: [TJOI2015]旅游 Description 为了提高智商,ZJY准备去往一个新世界去旅游.这个世界的城市布局像一棵树.每两座城市之间只有一条路径可 以互达.每座城市都有一种宝 ...

  2. bzoj 3999: [TJOI2015]旅游(树链剖分)

    3999: [TJOI2015]旅游 Time Limit: 10 Sec  Memory Limit: 256 MB Submit: 423  Solved: 214 [Submit][Status ...

  3. BZOJ3999 [TJOI2015]旅游

    水题--链剖然后维护区间最大值,最小值,和区间从左往右走的答案,还有从右往左走的答案即可 #include<iostream> #include<cstdlib> #inclu ...

  4. [暑假的bzoj刷水记录]

    (这篇我就不信有网站来扣) 这个暑假打算刷刷题啥的 但是写博客好累啊  堆一起算了 隔一段更新一下.  7月27号之前刷的的就不写了 , 写的累 代码不贴了,可以找我要啊.. 2017.8.27upd ...

  5. 退役前的做题记录2.0

    退役前的做题记录2.0 最近在刷省选题......大致上是按照省份刷的. 不过上面的题目顺序是按照写题的顺序排列的,所以可能会有点乱哈. [BZOJ2823][AHOI2012]信号塔 最小圆覆盖,随 ...

  6. 2022-2028年中国康养旅游行业市场竞争力分析及发展策略分析报告

    [报告类型]产业研究 [报告价格]4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国康养旅游行业市场行业相关概述.中国康养旅 ...

  7. 2022-2028年中国老年旅游市场深度调研及开发战略研究报告

    [报告类型]产业研究 [报告价格]¥4500起 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了中国老年旅游行业市场行业相关概述.中国老年 ...

  8. 2022-2028年中国房车旅游行业深度调研及投资前景预测报告

    [报告类型]产业研究 [出版时间]即时更新(交付时间约3个工作日) [发布机构]智研瞻产业研究院 [报告格式]PDF版 本报告介绍了房车旅游行业相关概述.中国房车旅游行业运行环境.分析了中国房车旅游行 ...

  9. 去哪儿app_共享照片APP开发 让出行旅游不留遗憾

    淘在路上App和在路上App有什么区别啊? 现在已经改成"淘在路上"和"淘在路上社区",两个APP的目的旨在打造领先的移动旅游生活社交电商."淘在路上 ...

最新文章

  1. 万字讲解API网关的来龙去脉
  2. 基于Django的乐观锁与悲观锁解决订单并发问题的一点浅见
  3. android gps定位工具类,工具类之LocationUtils(定位工具类)
  4. 高 star 开源项目来实验楼啦,深度学习强推教材
  5. 一头华发梳得整齐,一袭素衣低调谦逊。她是著名的环境工程专家清华第一位女院士钱易教授。...
  6. Autofac 依赖注入框架
  7. 「长文」2022年企业数字化转型的八大趋势
  8. Idea中找不到Java Application 的xml配置文件问题研究
  9. 代码管理学:功能实现,一定要与界面分开
  10. matlab 读取mp3文件,MATLAB音频文件读取
  11. 基于node.js和oicq的qq机器人 制作回顾分析笔记
  12. bin文件转dat文件
  13. jenkins不识别mvn命令
  14. ubuntu18字符终端不支持中文问题(汉字菱形)
  15. vue项目使用iconfont(本地下载、彩色icon)
  16. java 不可变_java - String是不可变的。 究竟是什么意思?
  17. PHP开发手机自动拨号软件
  18. python进行数据预处理(最大最小值规范化、零均值规范化、剔除奇异值、去噪、曲线拟合)
  19. 《信号与系统》(吴京)部分课后习题答案与解析——第四章(PART1)
  20. 华为机试:导师请吃火锅

热门文章

  1. SolidWorks二次开发 API-获取当前语言与重命名文件
  2. 【金融/交易】基于CEP的量化交易平台建设
  3. 以太坊 day (7)
  4. 小学计算机二课活动记录,小学信息技术活动记录.doc
  5. 今日头条as-cp-sign值生成
  6. 萌新建立的简单登陆网页,
  7. (转载)Python常见字符编码间的转换
  8. [渝粤教育] 武汉学院 大学生心理健康教育 参考 资料
  9. shell-grep用法
  10. Activity、Service、Task、Process和Thread的关系