HDU 6162 Ch’s gift (树的路径问题 DFS LCA 17多校第九场第2题)
来源:互联网 发布:网络直播需要什么资质 编辑:程序博客网 时间:2024/05/16 17:34
题目链接
HDU6162
题意
- 输入一棵
n(n ≤ 105) 个结点的无根树,i 号结点的权值为c[i] 。 - 有
q(q ≤ 105) 次查询,每次查询格式为:s,t,a,b ,求从s 号结点到t 结点的最短路径所经过的所有结点中权值在[a,b] 范围内的权值和。
分析
这道题很容易想到暴力的做法:
先把无根树转化为有根树,DFS一遍确定各个结点的深度和父亲,然后对于每次查询,s和t中较深的先往上遍历至s和t深度相同,然后s和t再同时向上遍历至相遇(即它们的LCA),在两个点向上遍历的过程中累加在[a,b]范围内的权值即可。
但这样做的时间复杂度上界是
附官方题解:
之后再补规范解法吧。。。
代码
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>#include <queue>#define ls (rt<<1)#define rs (rt<<1|1)using namespace std;typedef long long LL;const double pi=4*atan(1.0);const int MAXN=100010;const int MAXM=2*MAXN;struct Edge{ int to,next;}e[MAXM];int n,m,edgenum,head[MAXN],depth[MAXN],fa[MAXN],c[MAXN];void Add_Edge(int u,int v){ e[++edgenum]=(Edge){v,head[u]}; head[u]=edgenum;}void DFS(int u,int p,int d){ depth[u]=d;fa[u]=p; for (int t=head[u];t!=-1;t=e[t].next) { int v=e[t].to; if (v==p) continue; DFS(v,u,d+1); }}int main(){ int i,u,v,s,t,a,b,q; LL ans; while (scanf("%d%d",&n,&q)!=EOF) { for (i=1;i<=n;i++) scanf("%d",&c[i]); edgenum=0; memset(head,-1,sizeof(head)); for (i=1;i<n;i++) { scanf("%d%d",&u,&v); Add_Edge(u,v); Add_Edge(v,u); } DFS(1,-1,0);///把1号当成根节点 while (q--) { scanf("%d%d%d%d",&s,&t,&a,&b); if (depth[s]<depth[t]) swap(s,t); ans=0; while (depth[s]>depth[t])///先爬升到同一高度 { ans+=((a<=c[s]&&c[s]<=b)?c[s]:0); s=fa[s]; } while (s!=t)///一起爬升到LCA { ans+=((a<=c[s]&&c[s]<=b)?c[s]:0); ans+=((a<=c[t]&&c[t]<=b)?c[t]:0); s=fa[s];t=fa[t]; } ans+=((a<=c[s]&&c[s]<=b)?c[s]:0); if (q==0) printf("%lld\n",ans); else printf("%lld ",ans); } } return 0;}/*5 31 2 1 3 21 22 43 12 54 5 1 31 1 1 13 5 2 3*/
阅读全文
0 0
- HDU 6162 Ch’s gift (树的路径问题 DFS LCA 17多校第九场第2题)
- HDU 6162 Ch’s gift(LCA 暴力 17多校第九场)
- HDU 6162 Ch’s gift(LCA)
- hdu-6162 Ch’s gift 主席树
- hdu 6162 Ch’s gift
- HDU 6162 Ch’s gift
- HDU 6162 Ch’s gift
- HDU 6162 Ch's gift
- HDU 6162 Ch’s gift
- HDU6162 Ch’s gift【LCA】
- hdu6162 Ch’s gift(LCA)
- Ch’s gift HDU
- Ch’s gift HDU
- Ch’s gift HDU
- hdu 6162 Ch’s gift(主席树+树链剖分)
- HDU 6162 Ch’s gift(树链剖分+线段树)
- hdu 6162 Ch’s gift(主席树)
- Hdu 6162 Ch’s gift【思维+树链剖分+线段树】
- 1014(暴力树状数组)
- canvas实现粒子星空连线
- HTML5基础篇
- Linux zip 与 unzip命令详解
- ORA-00911: invalid character 错误解决
- HDU 6162 Ch’s gift (树的路径问题 DFS LCA 17多校第九场第2题)
- POJ2437
- schost.exe总是占用内存
- Ubuntu 16.04 上的 NGINX Web 服务器!
- #21
- 弱水三千,我饮三千---JSON,GSON,FastJSON详解
- git基础命令使用
- BZOJ 1965: [Ahoi2005]SHUFFLE 洗牌 快速幂 快速乘
- Python中定义字符串