题意:

已知树上的每个节点的值和节点之间的关系建成了一棵树,现在查询节点u到节点v的最短路径上的节点值在l到r之间的节点值的和。

思路:

用树链剖分将树映射到线段树上,线段树上维护3个值,max,min和sum即可。

接下来就是一个简单的线段树上的查询。

 #include<iostream>
#include<algorithm>
#include<cstring>
#include<cstdio>
#include<vector>
#include<stack>
#include<queue>
#include<cmath>
#include<map>
#include<set>
using namespace std;
typedef long long ll;
const int INF = 0x3f3f3f3f;
const int maxn=1e5+; int n, m, pos;
int s, e, a, b;
int val[maxn],fa[maxn],son[maxn],dep[maxn],num[maxn],top[maxn],p[maxn],fp[maxn];
ll ans[maxn];
vector<int> G[maxn]; struct node
{
int l, r;
ll mx,mi,sum;
}t[maxn<<]; void dfs(int u, int pre, int d)
{
dep[u]=d;
son[u]=-;
num[u]=;
fa[u]=pre;
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(v==pre) continue;
dfs(v,u,d+);
num[u]+=num[v];
if(son[u]==- || num[son[u]]<num[v])
son[u]=v;
}
} void getpos(int u, int sp)
{
top[u]=sp;
if(son[u]!=-)
{
p[u]=pos++;
fp[p[u]]=u;
getpos(son[u],sp);
}
else
{
p[u]=pos++;
fp[p[u]]=u;
return;
}
for(int i=;i<G[u].size();i++)
{
int v=G[u][i];
if(son[u]==v || v==fa[u]) continue;
getpos(v,v);
}
} void PushUp(int o)
{
t[o].mx=max(t[o<<].mx,t[o<<|].mx);
t[o].mi=min(t[o<<].mi,t[o<<|].mi);
t[o].sum=t[o<<].sum+t[o<<|].sum;
} void build(int l, int r, int o)
{
t[o].l=l;
t[o].r=r;
if(l==r)
{
t[o].mx=t[o].mi=t[o].sum=val[fp[l]];
return;
}
int mid=(l+r)>>;
build(l,mid,o<<);
build(mid+,r,o<<|);
PushUp(o);
} ll query(int ql, int qr, int l, int r, int o)
{
int mid=(l+r)>>;
if(ql<=l && qr>=r)
{
if(t[o].mx<a || t[o].mi>b) return ;
if(t[o].mi>=a && t[o].mx<=b) return t[o].sum;
return query(ql,qr,l,mid,o<<)+query(ql,qr,mid+,r,o<<|);
}
ll ans=;
if(ql<=mid) ans+=query(ql,qr,l,mid,o<<);
if(qr>mid) ans+=query(ql,qr,mid+,r,o<<|);
return ans;
} ll lca(int x,int y)
{
ll ans=;
while(top[x]!=top[y])
{
if(dep[top[x]]<dep[top[y]]) swap(x,y);
ans+=query(p[top[x]],p[x],,n,);
x=fa[top[x]];
}
if(dep[x]>dep[y]) swap(x,y);
ans+=query(p[x],p[y],,n,);
return ans;
} int main()
{
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m))
{
for(int i=;i<=n;i++) {G[i].clear();scanf("%d",&val[i]);}
for(int i=;i<n;i++)
{
int u,v;
scanf("%d%d",&u,&v);
G[u].push_back(v);
G[v].push_back(u);
}
dfs(,-,);
pos=;
getpos(,);
build(,n,);
for(int i=;i<=m;i++)
{
scanf("%d%d%d%d",&s,&e,&a,&b);
ans[i]=lca(s,e);
}
for(int i=;i<=m;i++)
printf("%lld%c",ans[i],i==m?'\n':' ');
}
return ;
}

HDU 6162 Ch's gift(树链剖分+线段树)的更多相关文章

  1. HDU 2460 Network(双连通+树链剖分+线段树)

    HDU 2460 Network 题目链接 题意:给定一个无向图,问每次增加一条边,问个图中还剩多少桥 思路:先双连通缩点,然后形成一棵树,每次增加一条边,相当于询问这两点路径上有多少条边,这个用树链 ...

  2. 【BZOJ-2325】道馆之战 树链剖分 + 线段树

    2325: [ZJOI2011]道馆之战 Time Limit: 40 Sec  Memory Limit: 256 MBSubmit: 1153  Solved: 421[Submit][Statu ...

  3. BZOJ2243 (树链剖分+线段树)

    Problem 染色(BZOJ2243) 题目大意 给定一颗树,每个节点上有一种颜色. 要求支持两种操作: 操作1:将a->b上所有点染成一种颜色. 操作2:询问a->b上的颜色段数量. ...

  4. Aizu 2450 Do use segment tree 树链剖分+线段树

    Do use segment tree Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://www.bnuoj.com/v3/problem_show ...

  5. B20J_2836_魔法树_树链剖分+线段树

    B20J_2836_魔法树_树链剖分+线段树 题意: 果树共有N个节点,其中节点0是根节点,每个节点u的父亲记为fa[u].初始时,这个果树的每个节点上都没有果子(即0个果子). Add u v d ...

  6. B20J_2243_[SDOI2011]染色_树链剖分+线段树

    B20J_2243_[SDOI2011]染色_树链剖分+线段树 一下午净调这题了,争取晚上多做几道. 题意: 给定一棵有n个节点的无根树和m个操作,操作有2类: 1.将节点a到节点b路径上所有点都染成 ...

  7. 洛谷P4092 [HEOI2016/TJOI2016]树 并查集/树链剖分+线段树

    正解:并查集/树链剖分+线段树 解题报告: 传送门 感觉并查集的那个方法挺妙的,,,刚好又要复习下树剖了,所以就写个题解好了QwQ 首先说下并查集的方法趴QwQ 首先离线,读入所有操作,然后dfs遍历 ...

  8. BZOJ4551[Tjoi2016&Heoi2016]树——dfs序+线段树/树链剖分+线段树

    题目描述 在2016年,佳媛姐姐刚刚学习了树,非常开心.现在他想解决这样一个问题:给定一颗有根树(根为1),有以下 两种操作:1. 标记操作:对某个结点打上标记(在最开始,只有结点1有标记,其他结点均 ...

  9. BZOJ2325[ZJOI2011]道馆之战——树链剖分+线段树

    题目描述 口袋妖怪(又名神奇宝贝或宠物小精灵)红/蓝/绿宝石中的水系道馆需要经过三个冰地才能到达馆主的面前,冰地中 的每一个冰块都只能经过一次.当一个冰地上的所有冰块都被经过之后,到下一个冰地的楼梯才 ...

  10. BZOJ2819Nim——树链剖分+线段树+Nim游戏

    题目描述 著名游戏设计师vfleaking,最近迷上了Nim.普通的Nim游戏为:两个人进行游戏,N堆石子,每回合可以取其中某一堆的任意多个,可以取完,但不可以不取.谁不能取谁输.这个游戏是有必胜策略 ...

随机推荐

  1. MSMQ研究

    开发过程记录如下: 1.   本机配置MSMQ ------控制面板-------启动或者关闭Windows功能----默认安装MSMQ即可 注意:本地安装后再VS中才能引用System.Messag ...

  2. python2.7 环境配置

    1.安装python2.7.8之后,配置环境变量:在path中配置python的安装路径 在cmd框中执行python,进入到python命令执行,即为配置成功. 2.执行过程中,提示缺少xlutil ...

  3. 分布式文件系统ceph快速部署

    架构图 配置ceph-deploy节点 管理节点配置ceph yum源 vim /etc/yum.repos.d/ceph.repo [ceph-noarch] name=Ceph noarch pa ...

  4. Toaster

    https://wiki.opendaylight.org/view/YANG_Tools:YANG_to_Java_Mapping#Identity https://wiki.opendayligh ...

  5. How to enable TLS 1.2 on Windows Server 2008 R2

    Problem How to enable TLS 1.2 on Windows Server 2008 R2? Resolution QuoVadis recommends enabling and ...

  6. Keras 源码分析

    . │ activations.py │ callbacks.py │ constraints.py │ initializations.py │ metrics.py │ models.py │ o ...

  7. selenium webdriver处理HTML5 的视频播放

    import org.openqa.selenium.By; import org.openqa.selenium.JavascriptExecutor; import org.openqa.sele ...

  8. Twitter OA prepare: Visit element of the array

    分析:就是建立一个boolean array来记录array里面每个元素的访问情况,遇到访问过的元素就停止visiting,返回未访问的结点个数 public int visiting(int[] A ...

  9. mysql5.7服务器The innodb_system data file 'ibdata1' must be writable导致无法启动服务器

    现象如下:The innodb_system data file 'ibdata1' must be writable. 解决方案如下: 1.关闭mysqld进程: 2.删除配置文件中datadir所 ...

  10. jms应用

    构建jms http://blog.csdn.net/haoxingfeng/article/details/9167895