hdu6162 Ch’s gift(LCA)

来源:互联网 发布:bat 算法工程师 编辑:程序博客网 时间:2024/06/05 18:02

题意:

给你一棵树,每个节点有一个价值,要执行m次询问,每次询问输入四个数,s,t,a,b,求解s到t的最短路,并把路径上节点的价值在[a,b]之间的价值求和输出。

思路:

对每组询问,求LCA(开始询问前先以1为根节点dfs一遍,确定每个节点的高度,开始每组询问时,根据高度差迭代求lca,详情看代码),并在求解过程判断价值符不符合要求。

代码:

#include <bits/stdc++.h>using namespace std;typedef long long ll;const int maxn = 1e5+7;ll ans[maxn],arr[maxn];int height[maxn],fa[maxn];vector<int> e[maxn];int n,m;void dfs(int u,int f,int h){    height[u] = h;    fa[u] = f;    int len = e[u].size();    for(int i = 0;i<len;i++)    {        int v= e[u][i];        if(v!=f)        {            dfs(v,u,h+1);        }    }}ll solve(int s,int t,int a,int b){    ll res = 0;    if(t==1)    {        while(s!=0)        {            if(arr[s]>=a&&arr[s]<=b)                res+=arr[s];            s = fa[s];        }        return res;    }    if(s==1)    {        while(t!=0)        {            if(arr[t]>=a&&arr[t]<=b)                res+=arr[t];            t = fa[t];        }        return res;    }    while(1)    {        if(height[t]==height[s])        {            if(t==s)            {                if(arr[s]>=a&&arr[s]<=b)                    res+=arr[s];                return res;            }            else            {                if(arr[s]>=a&&arr[s]<=b)                    res+=arr[s];                s = fa[s];            }        }        else if(height[s]>height[t])        {            if(arr[s]>=a&&arr[s]<=b)                    res+=arr[s];                s = fa[s];        }        else        {            if(arr[t]>=a&&arr[t]<=b)                res+=arr[t];            t = fa[t];        }    }    return res;}int main(){    while(~scanf("%d%d",&n,&m))    {        for(int i = 1;i<=n;i++)            e[i].clear();        for(int i = 1;i<=n;i++)            scanf("%lld",arr+i);        for(int i = 0;i<n-1;i++)        {            int u,v;            scanf("%d%d",&u,&v);            e[u].push_back(v);            e[v].push_back(u);        }        dfs(1,0,1);        for(int i = 0;i<m;i++)        {            int s,t,a,b;            scanf("%d%d%d%d",&s,&t,&a,&b);            ans[i] = solve(s,t,a,b);        }        for(int i= 0;i<m;i++)        {            if(i!=m-1)                printf("%lld ",ans[i]);            else                printf("%lld\n",ans[i]);        }    }    return 0;}

原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 一年级没有读好怎么办 小孩眉毛很杂乱怎么办 孩子不好好听课怎么办 成绩差的孩子怎么办 三年级语文太差怎么办? 孩子叛逆不学习怎么办 三年级阅读理解能力差怎么办 孩子静不下心怎么办 孩子体温低于35怎么办 小孩体温突然低怎么办 宝宝35.5度体温怎么办 宝宝出汗体温低怎么办 小孩体温35.2度怎么办 孩子睡觉出冷汗怎么办 小孩感冒发烧咳嗽怎么办 小孩咳嗽出汗多怎么办 小孩手脚出汗多怎么办 小孩感冒出虚汗怎么办 宝宝感冒出冷汗怎么办 宝宝感冒睡觉出汗怎么办 宝宝感冒冒冷汗怎么办 宝宝感冒爱出汗怎么办 宝宝感冒老出汗怎么办 两只小鸡打架怎么办 老年人老是换保姆怎么办 孩子9不吃饭怎么办 两岁半宝宝不爱喝水怎么办 宝宝老是不吃饭怎么办 宝宝不爱吃饭喝水怎么办 小宝宝突然不爱吃饭怎么办 一岁多小宝宝不爱吃饭怎么办 宝宝肚子发撑怎么办 小宝宝咳嗽有痰怎么办 一岁小宝宝咳嗽怎么办 oppo连wifi超时怎么办 小孩不会写3怎么办 秘密花园黑色底怎么办 孩子说话不利索怎么办? 两岁半宝宝x腿怎么办 孩子低烧不退怎么办 小班迷眼了怎么办教案