SP913 QTREE2 - Query on a tree II
思路
第一个可以倍增,第二个讨论在a到lca的路径上还是lca到b的路径上,
倍增即可
代码
#include <cstdio>
#include <algorithm>
#include <cstring>
using namespace std;
int jump[10010][16],sum[10010][16],fir[10010],nxt[10010*2],v[10010*2],w[10010*2],cnt,dep[10010],n;
void addedge(int ui,int vi,int wi){++cnt;v[cnt]=vi;w[cnt]=wi;nxt[cnt]=fir[ui];fir[ui]=cnt;
}
void dfs(int u,int f,int wx){dep[u]=dep[f]+1;jump[u][0]=f;sum[u][0]=wx;for(int i=1;i<15;i++)jump[u][i]=jump[jump[u][i-1]][i-1],sum[u][i]=sum[u][i-1]+sum[jump[u][i-1]][i-1];for(int i=fir[u];i;i=nxt[i]){if(v[i]==f)continue;dfs(v[i],u,w[i]);}
}
int lca(int x,int y){if(dep[x]<dep[y])swap(x,y);for(int i=15;i>=0;i--)if(dep[jump[x][i]]>=dep[y])x=jump[x][i];if(x==y)return x;for(int i=15;i>=0;i--)if(jump[x][i]!=jump[y][i])x=jump[x][i],y=jump[y][i];return jump[x][0];
}
int query_sum(int x,int y){int ans=0;if(dep[x]<dep[y])swap(x,y);for(int i=15;i>=0;i--)if(dep[jump[x][i]]>=dep[y]){ans+=sum[x][i];x=jump[x][i];}if(x==y)return ans;for(int i=15;i>=0;i--)if(jump[x][i]!=jump[y][i]){ans+=sum[x][i]+sum[y][i];x=jump[x][i],y=jump[y][i];}return ans+sum[x][0]+sum[y][0];
}
int kth_fa(int x,int k){for(int i=15;i>=0;i--){if((k>>i)&1)x=jump[x][i];}return x;
}
void init(void){memset(jump,0,sizeof(jump));memset(sum,0,sizeof(sum));memset(fir,0,sizeof(fir));memset(nxt,0,sizeof(nxt));memset(v,0,sizeof(v));memset(w,0,sizeof(w));cnt=0;memset(dep,0,sizeof(dep));
}
int main(){int T;scanf("%d",&T);while(T--){init();scanf("%d",&n);for(int i=1;i<n;i++){int a,b,c;scanf("%d %d %d",&a,&b,&c);addedge(a,b,c);addedge(b,a,c);}dfs(1,0,0);char opt[10];while(1){scanf("%s",opt);if(opt[1]=='O')break;if(opt[1]=='I'){int a,b;scanf("%d %d",&a,&b);printf("%d\n",query_sum(a,b));}else{int a,b,c;scanf("%d %d %d",&a,&b,&c);int LCA=lca(a,b);if(dep[a]-dep[LCA]+1>=c){printf("%d\n",kth_fa(a,c-1));}else{c-=dep[a]-dep[LCA];int t2=dep[b]-dep[LCA]+1;printf("%d\n",kth_fa(b,t2-c));}}}}return 0;
}
转载于:https://www.cnblogs.com/dreagonm/p/10768331.html
SP913 QTREE2 - Query on a tree II相关推荐
- 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至点 ...
- SPOJ - QTREE2 Query on a tree II(LCA)
题目链接:点击查看 题目大意:给出一棵无根树,每条边都有权值,接下来有数次操作,每次操作分为两种类型: DIST x y:求出点x到点y的唯一路径上的权值和 KTH x y k:求出点x到点y的唯一路 ...
- 【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, ...
- 【SPOJ】Count On A Tree II(树上莫队)
[SPOJ]Count On A Tree II(树上莫队) 题面 洛谷 Vjudge 洛谷上有翻译啦 题解 如果不在树上就是一个很裸很裸的莫队 现在在树上,就是一个很裸很裸的树上莫队啦. #incl ...
- 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 ...
- XXI Open Cup. Grand Prix of Korea I. Query On A Tree 17 树剖 + 二分 + 树带权重心
传送门 文章目录 题意: 思路: 题意: 给你一棵树,每棵树初始权值都为000,现在给你两个操作: (1)(1)(1)将uuu的子树权值全部加111. (2)(2)(2)将(u,v)(u,v)(u,v ...
- SP10707 COT2 - Count on a tree II
SP10707 COT2 - Count on a tree II 题意: 给定 n 个结点的树,每个结点有一种颜色. m 次询问,每次询问给出 u,v,回答 u,v 之间的路径上的结点的不同颜色数. ...
- 【莫队/树上莫队/回滚莫队】原理详解及例题:小B的询问(普通莫队),Count on a tree II(树上莫队),kangaroos(回滚莫队)
文章目录 问题引入 介绍莫队算法及其实现过程 时间复杂度 莫队算法适用范围 莫队奇偶优化 普通莫队:小B的询问 树上莫队:SP10707 COT2 - Count on a tree II 回滚莫队: ...
- 【LCT】Tree II(luogu 1501)
Tree II luogu 1501 题目大意 给出一棵树,让你进行若干操作,操作如下: 1.把两个点路径上的所有点权值加k 2.把两个点路径上的所有点权值乘k 3.把一条边断开,连上另一条边 4.查 ...
最新文章
- shell脚本编程学习笔记(四)shell操作数据库
- package.json 依赖包版本号
- 集员法对3D激光雷达和相机的外部校准
- LINUX 系统 安装Jexus 5.6和mono3.4 部署.net 环境
- SQLite数据库管理工具(SQLiteStudio)v3.1.1
- 【漫谈数据仓库】 如何优雅地设计数据分层
- Eureka服务器端启动时报错:Connection refused :connect
- c#使用椭圆签名算法制作软件序列号
- eclipse如何运行html文件,eclipse中applet嵌入html文件
- xtrabackup启动过程中出现的报错
- C++基础之函数的默认参数,什么是函数默认参数?
- cent os 查看服务器信息
- 加多宝首度披露"换头手术"的详细内幕
- 正交相机和透视相机的区别
- FeatherNets:卷积神经网络轻如羽毛,用于面部反欺骗
- 浅谈我国中小企业融资的问题及对策_毕业论文(20180404104959)
- 【论文笔记】AAAI2022多智能体强化学习论文五篇
- js 或者vue中for循环去掉最后一个逗号
- face++人脸识别接口实现原理(一)
- 如何快速实现一个基于Nginx网站的监控场景