poj3728The merchant树剖+线段树
如果直接在一条直线上,那么就建线段树
考虑每一个区间维护最小值和最大值和答案,就符合了合并的条件,一个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树剖+线段树的更多相关文章
- BZOJ_2238_Mst_树剖+线段树
BZOJ_2238_Mst_树剖+线段树 Description 给出一个N个点M条边的无向带权图,以及Q个询问,每次询问在图中删掉一条边后图的最小生成树.(各询问间独立,每次询问不对之后的询问产生影 ...
- BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树
BZOJ_4551_[Tjoi2016&Heoi2016]树_树剖+线段树 Description 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为 ...
- BZOJ_2157_旅游_树剖+线段树
BZOJ_2157_旅游_树剖+线段树 Description Ray 乐忠于旅游,这次他来到了T 城.T 城是一个水上城市,一共有 N 个景点,有些景点之间会用一座桥连接.为了方便游客到达每个景点但 ...
- 【BZOJ5210】最大连通子块和 树剖线段树+动态DP
[BZOJ5210]最大连通子块和 Description 给出一棵n个点.以1为根的有根树,点有点权.要求支持如下两种操作: M x y:将点x的点权改为y: Q x:求以x为根的子树的最大连通子块 ...
- [LNOI2014]LCA(树剖+线段树)
\(\%\%\% Fading\) 此题是他第一道黑题(我的第一道黑题是蒲公英) 一直不敢开,后来发现是差分一下,将询问离线,树剖+线段树维护即可 \(Code\ Below:\) #include ...
- [CF1007D]Ants[2-SAT+树剖+线段树优化建图]
题意 我们用路径 \((u, v)\) 表示一棵树上从结点 \(u\) 到结点 \(v\) 的最短路径. 给定一棵由 \(n\) 个结点构成的树.你需要用 \(m\) 种不同的颜色为这棵树的树边染色, ...
- LOJ#3088. 「GXOI / GZOI2019」旧词(树剖+线段树)
题面 传送门 题解 先考虑\(k=1\)的情况,我们可以离线处理,从小到大对于每一个\(i\),令\(1\)到\(i\)的路径上每个节点权值增加\(1\),然后对于所有\(x=i\)的询问查一下\(y ...
- BZOJ3531-[Sdoi2014]旅行(树剖+线段树动态开点)
传送门 完了今天才知道原来线段树的动态开点和主席树是不一样的啊 我们先考虑没有宗教信仰的限制,那么就是一个很明显的树剖+线段树,路径查询最大值以及路径和 然后有了宗教信仰的限制该怎么做呢? 先考虑暴力 ...
- 【bzoj4699】树上的最短路(树剖+线段树优化建图)
题意 给你一棵 $n$ 个点 $n-1$ 条边的树,每条边有一个通过时间.此外有 $m$ 个传送条件 $(x_1,y_1,x_2,y_2,c)$,表示从 $x_1$ 到 $x_2$ 的简单路径上的点可 ...
- 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 ...
随机推荐
- BZOJ 1634 [Usaco2007 Jan]Protecting the Flowers 护花:贪心【局部分析法】
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1634 题意: 约翰留下他的N只奶牛上山采木.可是,当他回来的时候,他看到了一幕惨剧:牛们正 ...
- POJ 2409 Let it Bead:置换群 Polya定理
题目链接:http://poj.org/problem?id=2409 题意: 有一串n个珠子穿起来的项链,你有k种颜色来给每一个珠子染色. 问你染色后有多少种不同的项链. 注:“不同”的概念是指无论 ...
- jsp和servlet的区别联系
jsp和servlet的区别联系 简单的说,SUN首先发展出SERVLET,其功能比较强劲,体系设计也很先进,只是,它输出HTML语句还是采用了老的CGI方式,是一句一句输出,所以,编写和修改HTML ...
- Python 微信通知 先挖个坑
桑心病狂,试试把报警信息发到微信上 原文 https://segmentfault.com/a/1190000009717078
- P2762 [网络流24题]太空飞行计划问题(最小割)
地址 最大权闭合子图裸题,不说了吧,求方案就是把s集遍历一遍. 错误记录:dfs那块忘判断残量了,11分×1. #include<cstdio> #include<iostream& ...
- bzoj 3796 Mushroom追妹纸 —— 后缀数组
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=3796 先把三个串拼在一起,KMP 求 s1 , s2 中每个位置和 s3 的匹配情况: 注意 ...
- mysql create table
- 【236】◀▶IEW-Unit01
Unit 1 Fast Food I.动名词的用法 Doing(V-ing) 核心思想:词性是名词,作用是动词 1. 名词 3)主语(句首) 保护环境是我们每个人的责任. Protecting th ...
- 如何在模板类中使用这些point类型?
博客转载自:http://www.pclcn.org/study/shownews.php?lang=cn&id=271 由于PCL模块较多,并且是一个模板库,在一个源文件里包含很多PCL算法 ...
- Google Analytics添加到网站
把Google Analytics添加到网站的具体方式 https://developers.google.com/analytics/devguides/collection/analyticsjs ...