题目链接:点击查看

题目大意:给出一棵无根树,每条边都有权值,接下来有数次操作,每次操作分为两种类型:

  1. DIST x y:求出点x到点y的唯一路径上的权值和
  2. KTH x y k:求出点x到点y的唯一路径上第k个点

题目分析:因为是无根树,所以我们随便找个节点当根就行了,为了方便,我们每次都选取第一个点当根节点,接下来对于操作1,我们在树上求一遍前缀和即可,对于操作2,涉及到了路径上的问题,我们就需要借助LCA把这条路径先拿出来,然后就很好办了,分类讨论一下,因为第k个点不是在u-lca这条链上就是在lca-v这条链上,讨论一下需要往上跳几步,然后倍增跳上去就行了

代码:

#include<iostream>
#include<cstdlib>
#include<string>
#include<cstring>
#include<cstdio>
#include<algorithm>
#include<climits>
#include<cmath>
#include<cctype>
#include<stack>
#include<queue>
#include<list>
#include<vector>
#include<set>
#include<map>
#include<sstream>
using namespace std;typedef long long LL;const int inf=0x3f3f3f3f;const int N=1e4+100;struct Node
{int to,w;Node(int TO,int W){to=TO;w=W;}
};vector<Node>node[N];int n;int limit;int deep[N],dp[N][20],sum[N];void dfs(int u,int fa,int dep,int val)
{sum[u]=val;deep[u]=dep;dp[u][0]=fa;for(int i=1;i<=limit;i++)dp[u][i]=dp[dp[u][i-1]][i-1];for(int i=0;i<node[u].size();i++){int v=node[u][i].to;int w=node[u][i].w;if(v==fa)continue;dfs(v,u,dep+1,val+w);}
}int LCA(int a,int b)
{if(deep[a]<deep[b])swap(a,b);for(int i=limit;i>=0;i--)if(deep[a]-deep[b]>=(1<<i))a=dp[a][i];if(a==b)return a;for(int i=limit;i>=0;i--)if(dp[a][i]!=dp[b][i]){a=dp[a][i];b=dp[b][i];}return dp[a][0];
}int solve(int u,int v,int k)
{int lca=LCA(u,v);int len=deep[u]+deep[v]-2*deep[lca]+1;if(deep[u]-deep[lca]>=k-1){int temp=k-1;for(int i=limit;i>=0;i--)if((temp>>i)&1)u=dp[u][i];return u;}else{int temp=len-k;for(int i=limit;i>=0;i--)if((temp>>i)&1)v=dp[v][i];return v;}
}void init()
{for(int i=1;i<=n;i++)node[i].clear();limit=log2(n)+1;
}int main()
{
//  freopen("input.txt","r",stdin);
//  ios::sync_with_stdio(false);int w;cin>>w;while(w--){scanf("%d",&n);init();for(int i=1;i<n;i++){int a,b,c;scanf("%d%d%d",&a,&b,&c);node[a].push_back(Node(b,c));node[b].push_back(Node(a,c));}dfs(1,-1,0,0);char s[10];while(scanf("%s",s)&&s[1]!='O'){if(s[0]=='D'){int u,v;scanf("%d%d",&u,&v);printf("%d\n",sum[u]+sum[v]-2*sum[LCA(u,v)]);}else{int u,v,k;scanf("%d%d%d",&u,&v,&k);printf("%d\n",solve(u,v,k));}}}return 0;
}

SPOJ - QTREE2 Query on a tree II(LCA)相关推荐

  1. LCA SP913 QTREE2 - Query on a tree II

    SP913 QTREE2 - Query on a tree II 给定一棵n个点的树,边具有边权.要求作以下操作: DIST a b 询问点a至点b路径上的边权之和 KTH a b k 询问点a至点 ...

  2. SP913 QTREE2 - Query on a tree II

    思路 第一个可以倍增,第二个讨论在a到lca的路径上还是lca到b的路径上, 倍增即可 代码 #include <cstdio> #include <algorithm> #i ...

  3. 【SPOJ】Count On A Tree II(树上莫队)

    [SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...

  4. SPOJ 375. Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 375. Query on a tree Problem code: QTREE You are given a t ...

  5. 【SPOJ - QTREE2】Query on a tree II(LCA,倍增)

    题干: You are given a tree (an undirected acyclic connected graph) with N nodes, and edges numbered 1, ...

  6. spoj 375 Query on a tree (树链剖分)

    题目链接: http://www.spoj.com/problems/QTREE/ 题意: 给一颗树,每条边有一个权值.有两种操作: 1.修改某条边的值: 2.询问a.b两点路径上边权的最大值. 分析 ...

  7. SPOJ 375 Query on a tree(线段树维护树链剖分)

    题目链接:http://www.spoj.com/problems/QTREE/ 题意:给出一个树,两种操作:(1)修改某条边的权值:(2)询问某两个顶点之间边的最大值. 思路:树的路径剖分和线段树维 ...

  8. SPOJ - QTREE Query on a tree(树链剖分+线段树)

    题目链接:点击查看 题目大意:给出一棵由n个点组成的树,再给出数个操作,每次操作分为下列几种类型: QUERY x y:询问点x-点y这条路径上的所有边权的最大值 CHANGE x y:将第x条边的权 ...

  9. spoj 375 Query on a tree

    题意:给一棵树,节点数不超过10000,有两个操作:1.询问a,b路径上最长的边长.2.把第a条边长度改为b. p.s.人生中第一个树链剖分,尼玛debug了好久好久我擦... 分析:轻重边路径剖分, ...

最新文章

  1. 白宫计划2019年春季发布新版人工智能研究战略
  2. 插值算法C实现(二元全区间)
  3. Windows Phone 网络HttpWebRequest用法
  4. 固定收益证券(fixed income)
  5. 常用的函数式接口_Supplier接口
  6. 光纤转CAN总线在消防报警主机联网中的应用
  7. 从 Elasticsearch 来看分布式系统架构设计
  8. 抖音举办平台治理开放日 半年捣毁25个黑产团伙
  9. Eclipse代码自动补全设置
  10. ios plist_iOS属性列表(plist)示例
  11. “产品助理最重要的工作是 Android 版本的设计与测试”
  12. js判断是否是正整数,js判断是否是数字
  13. 最新楚琳web打印控件下载 - 2019适配所有浏览器
  14. java markdown 转 pdf_markdown转为pdf文件
  15. C++控制台五子棋(带背景音乐)
  16. 这不是一篇技术型的文章,而是一篇能让你在IT世界中畅游的方法
  17. jpeg 与 png 图片格式的区别
  18. Salesforce学习 丨3张图搞懂SFDC认证考试体系及费用,看看30多个证你要怎么考
  19. 【财富空间】陈春花:向内打破,为成长赋能;面对全球市场,要有全球化思维、本土化行动
  20. 逆向-360逆向writeup

热门文章

  1. Redis快照(Snapshot)特点
  2. MySQL 高级 函数
  3. MySQL 高级 - 视图 - 概述
  4. SpringMVC的数据响应-回写数据-返回对象或集合2(应用)
  5. flume案例-文件数据采集-运行测试
  6. Redis与Zookeeper实现分布式锁区别
  7. 通过Zuul上传文件,禁用Zuul的Filters
  8. 简单工厂 jdk源码解析
  9. 单一职责原理讲解coding
  10. 在linux下创建自定义service服务