Lightoj 1082【RMQ】】的更多相关文章

这里很low地写了个线段树... #include <bits/stdc++.h> using namespace std; typedef long long LL; const int N=1e5+10; struct SegT{ int left; int right; int w; }; SegT q[N*4]; void Build(int num,int L,int R) { q[num].left=L; q[num].right=R; if(q[num].left==q[num]…
题目大意:求树上任意两点距离. 思路: dis[i]表示i到根的距离(手动选根),则u.v的距离=dis[u]+dis[v]-2*dis[lca(u,v)]. lca:u~v的dfs序列区间里,深度最小的节点即为u.v的lca(最近公共祖先),RMQ把它找到.   难点: 何为dfs序: 就是树上dfs依次遍历的节点编号的序列.它的特点是回溯时会[再次]经过非叶节点,非叶节点在dfs序中出现多次,且dfs序列个数>节点个数. 为什么要用dfs序: 因为u.v的lca只出现在u.v的dfs序间.比…
题目:(开始自己描述题目了...) 第一题大意: 求1~n的所有排列中逆序对为k个的方案数,输出方案数%10000,n<=1000. 解:这道题一个递推,因为我基本上没怎么自己做过递推,所以推了一个小时,而其实熟练后几分钟十多分钟就推出来了.好吧,我递推的方法:从n=1 开始递推,当n=2的时候由 n=1 推出,以此类推.如何递推?以n=3,k=3为例:有三种方式结尾,以3结尾,前两个数由1,2 排列,3在1,2后面不产生逆序对,那么方案数就等于当n=2的时候产生3个逆序对的方案数,为0 :以2…
1. 概述 RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值.这两个问题是在实际应用中经常遇到的问题,下面介绍一下解决这两种问题的比较高效的算法.当然,该问题也可以用线段树(也叫区间树)解决,算法复杂度为:O(N)~O(logN),这里我们暂不介绍. 2.RMQ算法 对于该问题,最容易想到的解决方案是遍历,复杂度是O(n).但当数据量…
题目描述 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先. 输入输出格式 输入格式: 第一行包含三个正整数N.M.S,分别表示树的结点个数.询问的个数和树根结点的序号. 接下来N-1行每行包含两个正整数x.y,表示x结点和y结点之间有一条直接连接的边(数据保证可以构成树). 接下来M行每行包含两个正整数a.b,表示询问a结点和b结点的最近公共祖先. 输出格式: 输出包含M行,每行包含一个正整数,依次为每一个询问的结果. 输入输出样例 输入样例#1: 复制 5 5 4 3 1 2 4…
<题目链接> <转载于 >>>  > 题目大意: 给出一个长度不超过1000位的数,求删去m位数字以后形成的最小的数字是多少. 解题分析: 分析:我们可以把题目转化为这样一个模型:从A[1].A[2].…….A[n] n个数中选出n-m个数,使得组成的数最小.一.使用RMQ,设原数字长为n,那么除去m个数字后还剩n-m个数字.    下面的(一).(二)用到了抽屉原理(1)因为有n-m个数字,那么在0到m-1位置中最小的那个数字必是结果中的第一个数字,记录其位置为…
<题目链接> 题目大意: 给定一段序列,进行q次询问,输出每次询问区间的最大值与最小值之差. 解题分析: RMQ模板题,用ST表求解,ST表用了倍增的原理. #include <cstdio> #include <cstring> #include <cmath> #include <algorithm> using namespace std; typedef long long ll; ; int n,q; ll maxsum[M][],mi…
<题目链接> 题目大意: 给你一个长度为n的序列,这个序列每个数都有一个值,接下来进行q次询问,问在指定区间内出现次数最多的数出现了几次. 解题分析: 因为该序列是非降序的,所以该序列中的所有相等的数都是连续的,因此,我们可以先用dp预处理一下,dp[i]表示以第i个数结尾的最大连续相等个数,于是,本题目就变成了,在指定区间内,dp[i]的最大的值是多少. #include <cstdio> #include <cstring> #include <cmath&g…
<题目链接> 题目大意:给你一段序列,进行q次区间查询,每次都输出询问区间内的最小值. 解题分析: RMQ模板题,下面用在线算法——ST算法求解.不懂ST算法的可以看这篇博客  >>> #include <cstdio> #include<cstring> #include <cmath> #include <algorithm> using namespace std; ; int n,q; ]; //表示从第i个数起连续2^…
摘自网友,具体哪个忘记了,抱歉~ 定义: RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题: 对于长度为n的数列A,回答若干询问RMQ(A,i,j) (i,j<=n),返回数列A中下标在i,j之间的最小/大值. 此类问题的解决方法有很多,暴力(当然也就说说,基本没有出题的会让你暴过去).线段树(复杂度为O(nlogn)).以及一个非常有名的在线处理RMQ问题的算法 -- Sparse_Table算法,简称ST算法,该算法能在进行O(nlogn)的…