如果直接在一条直线上,那么就建线段树

考虑每一个区间维护最小值和最大值和答案,就符合了合并的条件,一个log轻松做

那么在树上只要套一个树剖就搞定了,多一个log也不是问题

注意考虑在树上的话每一条链都有可能是正着被用和反着被用,所以存两个答案

所以维护信息只需要一个merge和一个reverse

代码如下:

 #include <cstdio>
#include <iostream>
#define mid (l+r>>1)
using namespace std;
struct node
{
int ma,mi,ans,rev_ans;
node()
{
ma=;mi=;ans=;rev_ans=;
}
node(int a,int b,int c,int d)
{
ma=a;mi=b;ans=c;rev_ans=d;
}
void rever()
{
swap(ans,rev_ans);
}
} tr[];
int N,TIME,n,m,p,q;
int to[],nex[],fir[],w[],pos[],loc[];
int fa[],size[],dep[],top[];
node merge(node a,node b)
{
return node(max(a.ma,b.ma),min(a.mi,b.mi),max(b.ma-a.mi,max(a.ans,b.ans)),max(a.ma-b.mi,max(a.rev_ans,b.rev_ans)));
}
void add(int p,int q)
{
to[++N]=q;nex[N]=fir[p];fir[p]=N;
to[++N]=p;nex[N]=fir[q];fir[q]=N;
}
int build(int now,int fat)
{
fa[now]=fat;size[now]=;dep[now]=dep[fat]+;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fat)
size[now]+=build(to[i],now);
return size[now];
}
void pou(int now,int tp)
{
top[now]=tp;loc[++TIME]=now;
pos[now]=TIME;
int best=;
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fa[now])
best=best?((size[best]<size[to[i]])?to[i]:best):to[i];
if(best)
pou(best,tp);
for(int i=fir[now];i;i=nex[i])
if(to[i]!=fa[now] && to[i]!=best)
pou(to[i],to[i]);
}
void work(int now,int l,int r)
{
if(l==r)
{
tr[now]=node(w[loc[l]],w[loc[l]],,);
return;
}
work(now<<,l,mid);
work(now<<|,mid+,r);
tr[now]=merge(tr[now<<],tr[now<<|]);
}
node que(int now,int l,int r,int x,int y)
{
if(l==x && r==y)
return tr[now];
node ret=node();
if(x<=mid)
ret=que(now<<,l,mid,x,min(y,mid));
if(y>mid)
ret=merge(ret,que(now<<|,mid+,r,max(mid+,x),y));
return ret;
}
int main()
{
scanf("%d",&n);
for(int i=;i<=n;i++)
scanf("%d",&w[i]);
for(int i=;i<n;i++)
scanf("%d%d",&p,&q),add(p,q);
build(,);
pou(,);
work(,,n);
scanf("%d",&m);
for(int i=;i<=m;i++)
{
scanf("%d%d",&p,&q);
node P=node(),Q=node();
while(top[p]!=top[q])
{
if(dep[top[p]]<dep[top[q]])
{//work on q
Q=merge(que(,,n,pos[top[q]],pos[q]),Q);
q=fa[top[q]];
}
else
{//work on p
node now=que(,,n,pos[top[p]],pos[p]);
now.rever();
P=merge(P,now);
p=fa[top[p]];
}
}
if(dep[p]<dep[q])
P=merge(P,que(,,n,pos[p],pos[q]));
else
{
node now=que(,,n,pos[q],pos[p]);
now.rever();
P=merge(P,now);
}
P=merge(P,Q);
printf("%d\n",P.ans);
}
return ;
}

poj3728The merchant树剖+线段树的更多相关文章

  1. BZOJ_2238_Mst_树剖+线段树

    BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...

  2. BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树

    BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...

  3. BZOJ_2157_旅游_树剖+线段树

    BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...

  4. 【BZOJ5210】最大连通子块和 树剖线段树+动态DP

    [BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...

  5. [LNOI2014]LCA(树剖+线段树)

    \(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...

  6. [CF1007D]Ants[2-SAT+树剖+线段树优化建图]

    题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...

  7. LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)

    题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...

  8. BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)

    传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...

  9. 【bzoj4699】树上的最短路(树剖+线段树优化建图)

    题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...

  10. POJ3237 Tree(树剖+线段树+lazy标记)

    You are given a tree with N nodes. The tree’s nodes are numbered 1 through N and its edges are numbe ...

随机推荐

  1. Win7 下安装MongoDB

    1).下载MongoDBhttp://downloads.mongodb.org/win32/mongodb-win32-i386-2.4.5.zip 下载Windows 32-bit版本并解压缩,程 ...

  2. laravel基础课程---15、分页及验证码(lavarel分页效果如何实现)

    laravel基础课程---15.分页及验证码(lavarel分页效果如何实现) 一.总结 一句话总结: 数据库的paginate方法:$data=\DB::table("user" ...

  3. DS:架构-1

    ylbtech-DS:架构-1 1. 类库返回顶部 1. 2. 2. 引用返回顶部 1. Api-Base\Common\OAuth2Provider\ServiceBase-OAuth2Provid ...

  4. Java虚拟机学习 - 体系结构 内存模型(转载)

    一:Java技术体系模块图 二:JVM内存区域模型 1.方法区 也称"永久代” .“非堆”,  它用于存储虚拟机加载的类信息.常量.静态变量.是各个线程共享的内存区域.默认最小值为16MB, ...

  5. js 常用验证

    邮箱验证: $(function () {            $("#txt_Email").blur(function () {                var ema ...

  6. POJ-3176

    Cow Bowling Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 19864   Accepted: 13172 Des ...

  7. linux系统下file使用的magic文件格式说明

    magic 本手册是file命令所使用的magic文件的格式说明文档,版本是5.04. file命令用于识别文件类型,其他检测,检测文件内容中是否符合 'magic模式',也就是规则. /usr/sh ...

  8. CRC原理总结

    CRC常用于判断文件在传输过程中文件内容是否被更改以及其他的一些加密算法,在Java中,CRC32 工具类提供给我们使用. 1.CRC校验具体原理如下: 在要发送的数据帧后面附加一个数(这个就是用来校 ...

  9. 深度卷积网络-Inception系列

    目录 1. Inception V1 1.1 Inception module 2. Inception V2 3. Inception V3 4. Inception V4, Inception-R ...

  10. CentOS 6.5 安装Clang 3.5.0

    来自引用: http://www.cnblogs.com/dudu/p/4294374.html 编译llvm几乎耗费了1个小时-.. 编译CoreCLR需要Clang 3.5,而CentOS上安装的 ...