HDU2586(ST表+dfs)
ST 表算法用于查询区间最值,为静态算法,查询区间最值时不能更新信息,预处理复杂度为 O(nlongn),查询为 O(1)。适用于不更新信息且查询很多的问题。
题意:首先要计算出各个可到达点之间的长度,然后利用区间查找求解!
#include<iostream>
#include<cmath>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int maxx=4e4+10;;
const int inf=0x3f3f3f3f;
int a[maxx];
int n,q;
int m;
int maxsum[maxx][20],minsum[maxx][20];
struct node{int v,cost;node(int v1,int cost1):v(v1),cost(cost1){}
};
vector<node>G[maxx];
void dfs(int u,int fa){for(int i=0;i<G[u].size();i++){int v=G[u][i].v;int w=G[u][i].cost;if(v==fa)continue;a[v]=a[u]+w;dfs(v,u);}
}
void RMQ(){for(int i=1;i<=n;i++){maxsum[i][0]=minsum[i][0]=a[i];}for(int j=1;(1<<j)<=n;j++){for(int i=1;i+(1<<j)-1<=n;i++){minsum[i][j]=min(minsum[i][j-1],minsum[i+(1<<(j-1))][j-1]);maxsum[i][j]=max(maxsum[i][j-1],maxsum[i+(1<<(j-1))][j-1]);}}
}
int maxl,minl;
void Query(int l,int r){int k=(int)((log(r-l+1))/log(2.0));maxl=max(maxsum[l][k],maxsum[r-(1<<k)+1][k]);minl=min(minsum[l][k],minsum[r-(1<<k)+1][k]);cout<<maxl-minl<<endl;
}int main(){int t;scanf("%d",&t);while(t--){scanf("%d %d",&n,&m);memset(a,0,sizeof(a));memset(maxsum,0,sizeof(maxsum));memset(minsum,0,sizeof(minsum));for(int i=1;i<=n;i++){G[i].clear();}for(int i=1;i<=n-1;i++){int a,b,cost;scanf("%d %d %d",&a,&b,&cost);G[a].push_back(node(b,cost));G[b].push_back(node(a,cost));}dfs(1,-1);RMQ();for(int i=1;i<=m;i++){int left,right;scanf("%d %d",&left,&right);if(left>right)swap(left,right);Query(left,right);}}return 0;
}
HDU2586(ST表+dfs)相关推荐
- NOIp 数据结构专题总结 (1):STL、堆、并查集、ST表、Hash表
系列索引: NOIp 数据结构专题总结 (1) NOIp 数据结构专题总结 (2) STL structure std::vector #include <vector> std::vec ...
- 【JZOJ5064】【GDOI2017第二轮模拟day2】友好城市 Kosarajo算法+bitset+ST表+分块
题面 在Byteland 一共有n 座城市,编号依次为1 到n,这些城市之间通过m 条单向公路连接. 对于两座不同的城市a 和b,如果a 能通过这些单向道路直接或间接到达b,且b 也能如此到达a,那么 ...
- szu 寒训 day#3 ST表 和 LCA问题 附例题 菜鸡解法
昨天我们讲述了树状数组今天我们来讲ST表(解决静态RMQ (Rang Minmum/Maximum Query)问题的数据结构) 假如说我们暴力去查询区间的最值得话每次操作都是O(n) 如果询问次数跟 ...
- 倍增算法入门 超详细解答+LCA+RMQ(ST表)+例题剖析
目录 一.倍增算法 二.倍增算法的应用:求LCA(最近公共祖先)附模板题 三.倍增算法的应用:RMQ 问题(ST表)附模板题 一.倍增算法 要了解倍增之前,强烈建议大家先看一下这位大佬对倍增的解释:[ ...
- 【无码专区10】第K大查询(双向链表 /主席树+st表)
已自我实现,但还是归入无码专区序列.哈哈哈哈哈 对于my idea部分,我的每一个想法都实现了,可供参考. problem 给定一个 1∼n1\sim n1∼n 的排列和 kkk,求所有 r−l+1≥ ...
- 牛客练习赛 67——ST表
A.牛牛爱字符串 注意原字符串有空格,不要用cin #define IO ios::sync_with_stdio(false);cin.tie();cout.tie(0) #pragma GCC o ...
- 51Nod.1766.树上最远点对(树的直径 RMQ 线段树/ST表)
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq ...
- 【BZOJ2588】Count on a tree,主席树维护链+ST表求LCA
传送门 写在前面:一天下来就写了两道主席树的题--(codevs上的一道智障天梯不算) 思路: 才知道原来主席树不仅可以通过dfs序维护子树区间,还可以直接维护一条到根的链-- 我们建好主席树后,每次 ...
- LCA RMQ+ST表学习笔记
RMQ RMQ问题:在给定的一个长度位N的区间中,有M个询问,每次询问给出区间[L,R],求出区间段元素的 最大值/最小值.对于RMQ问题很容易想到遍历的做法,将区间[L,R]中的元素遍历一遍,即可寻 ...
最新文章
- 剑网三通过VR来进行游戏快乐,是不是会加倍?什么时候用得上?
- 服务器u8系统数据库不存在,用友u8服务器端数据库不装
- lvm硬盘管理及LVM扩容
- eclipse-中如何显示工程树形结构
- ASP.net导出Excel的几种方式
- NLPIR使用(1)
- Chrome 52 将支持 ES7:Canary 通道已上线
- 正视苦难,民族的心灵史——1942
- c/c++成长之捷径
- 热议:为什么近些年硕士生考博意愿偏低?
- 老男孩python全栈s21day21作业(面向对象)
- 阿里矢量图iconfont的两种使用方法
- Mac idea破解到2100年
- CodeForces - 863B-Kayaking(暴力)
- 车载吸尘器方案-无刷马达运用2
- undefined reference to `__strncpy_chk‘ 解决方法
- 剑指offer做题记录
- 涉及数字的英语表示——总览
- 你想成为阿里巴巴的一名数据工程师吗?以下的应聘要求你得好好看了
- 子午学术论坛邀请注册码