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

考虑每一个区间维护最小值和最大值和答案,就符合了合并的条件,一个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. 简单的可兼容所有浏览器的操作html元素的javascript框架

    1.根据id名称取元素  $id(idName) 2.根据class定义取元素  $class(className)返回所有class被定义成className的元素数组,或者$Eclass(clas ...

  2. 【详解】苹果AppStore审核被拒,原因终逃不过这些!

    近日,相信很多开发者都留意到了: 苹果针对应用标题的审核确有明显的变严趋势!我们在<惊!苹果再次加强审核力度,众App纷纷止步应用标题>中也对该现象进行了详细的分析,并给出了相应的解决方案 ...

  3. 分享知识-快乐自己:微服务的注册与发现(基于Eureka)

    1):微服务架构 服务提供者.服务消费者.服务发现组件这三者之间的关系: 各个微服务在启动时,将自己的网络地址等信息注册到服务发现组件中,服务发现组件会存储这些信息. 服务消费者可从服务发现组件查询服 ...

  4. window/body/img/iframe 的onload事件

    在html页面中,只有body,img,iframe这一类标签具有onload事件. onload事件表示在当前元素载入完成后发生的事件.其中,window也有onload事件,但是跟body的是同一 ...

  5. nginx websocket

    前两天折腾了下socketio,部署完发现通过nginx代理之后前端的socket无法和后端通信了,于是暴查一通,最后解决问题: location / { proxy_pass http://127. ...

  6. BaseAdapter/AsyncTask/..等等细节

    BaseAdapter中的getCount之类的函数,是在constructor之后才启动的.这印证了构造函数的优先级是max的. 图片 这一点的意义在于,当你想给getCount返回一个具体参数的时 ...

  7. Codeforces Round #397 题解

    Problem A. Neverending competitions 题目大意 一个团队有多个比赛,每次去比赛都会先订机票去比赛地点,然后再订机票返回.给出\(n\)个含有起止地点的购票记录(不按时 ...

  8. Pmod使用的4种模式

    引言 多年以来,一直存在标准泛滥的现象,而我们电子业尤其严重.您是否曾经想过,为什么我们对有些奇怪的数字或测量计的东西建立标准?关于航天飞机的固体燃料火箭推进器的直径是否真的源自于马屁股的宽度的讨论非 ...

  9. 演讲:对 2000 多亿条数据做一次 group by 需要多久?

    http://2017.qconbeijing.com/presentation/646?utm_source=weibo&utm_medium=infoq&utm_campaign= ...

  10. 使用远程线程来注入DLL

    使用远程线程来注入DLL DLL注入技术要求我们目标进程中的一个线程调用LoadLibrary来载入我们想要的DLL (1)用OpenProcess函数打开目标进程(2)用VirtualAllocEx ...