随笔分类 - RMQ
摘要:LCA题意:单case,一棵无根树,输入点数和操作数,下面一行n个值代表每个点的权。下面n-1行是树边操作分为0 x w ,表示把点x的权改为wk a b , 求出,从a到b的路径中,第k大的点权这题,没什么太特别的地方,一开始写怕会超时,最后没有,就是直接按照题意来就可以了对于修改操作就直接修改对于查询第k个权的操作,先求出a,b的lca,然后将a到b路径上的点权都保存在一个数组中,然后降序排序,输出第k个元素即可#include <iostream>#include <cstdio>#include <cstring>#include <cmath
阅读全文
摘要:LCA题意:一个无根树,给出主角一开始所在的位置S,然后下面q个操作,操作包括查询和修改操作,对于查询操作就是当前主角的位置到目的点的距离是多少,然后主角去到那里之后就在那里等待,下次查询的时候那里就是新的起点(所以sample中第二次查询为什么是3)。修改是修改第k条边的权值,边的编号就是输入的顺序。这题可能是数据水了还是怎么,对于修改操作虽然有优化的方法,但是用最朴素的直接遍历下去修改也是可行的,不会超时,不过时间就比较糟糕了修改操作其实是修改了一部分子树的dir值,对于查询操作就是普通的LCA这里只能用RMQ了,不能用Tarjan#include <iostream>#inc
阅读全文
摘要:二维RMQ题意:给一个n*m的矩阵,下面q的询问,每个询问给出一个子矩阵的左上角和右下角的坐标,要你求出这个子矩阵里面的最大元素,然后输出,并且,这个最大元素和子矩阵的四个角上的元素比较,只要能和其中一个元素相等,就输出yes,否则输出no一维RMQ的ST算法,是叫一段2^i长度的序列分成两个2^(i-1)的序列然后计算。二维的RMQ依然使用ST的DP思想,不过对于一个矩形,将其分成完全相等的4个部分,然后求最值,特殊情况是,当一个子矩阵的宽为1,即在宽上不能二分的时候,已经长为1,即长不能二分的时候,其实就是一个一维的RMQ,我是采用了单独处理的方法(我把它归为初始化的一部分),而对于一般情
阅读全文
摘要:LCA题意:LCA模板题,输入n和m,表示n个点m条边,下面m行是边的信息,两端点和权,后面的那个字母无视掉,没用的。接着k,下面k个询问lca,输出即可有人说要考虑不连通的情况,我没考虑AC了,另外可能有u,u这样的询问,不过这不影响,照样是写模板,没有特判,一样能过还是Tarjan快一些LCA转RMQ在线算法#include <iostream>#include <cstdio>#include <cstring>#include <cmath>using namespace std;#define N 40010#define M 25in
阅读全文
摘要:LCA模板题题意:给一个无根树,有q个询问,每个询问两个点,问两点的距离。求出 lca = LCA(X,Y) , 然后 dir[x] + dir[y] - 2 * dir[lca]dir[u]表示点u到树根的距离下面两份代码都可以通过HDU的C++和G++,都不存在爆栈问题,网上很多人说会爆栈,加了申请系统栈语句,其实不用,而且好想比赛中不允许使用的Tarjan算法跑得更快些,C++ 15ms, G++ 50ms 左右, RMQ大概60ms在线算法:LCA转化为RMQ#include <iostream>#include <cstdio>#include <cst
阅读全文
摘要:LCA题意:给一个无根树,有q个询问,每个询问3个点,问将这3个点连起来,距离最短是多少,LCA的模板题,分别求LCA(X,Y),LCA(X,Z),LCA(Y,Z),和对应的距离,然后3个距离相加再除以2就是这个询问的结果对于一对点,x,y, lca = LCA(x,y) , 那么点x到点y的距离为 dir[x] + dir[y] - 2 * dir[lca] ; 其中dir[u] 表示点u到树根的距离由于是模板题,只给代码,详细的讲解可以在学习笔记里面找《LCA与RMQ》在线算法:LCA转RMQ#include <iostream>#include <cstdio>#
阅读全文
摘要:RMQ模板题,用ST算法//DP预处理//dp[i][j] 表示从下标i开始,长度为2^j的最大值//状态转移方程 dp[i][j] = max{ dp[i][j-1] , dp[i+2^(j-1)][j-1] }//也就是一个长度为2^j的区间,二分为两个2^(j-1)的长度//对于查询[a,b]以内的最大值,先求出区间长度LEN = b-a+1//查询结果为 res = max{dp[a][k] , dp[b-2^k+1][k]} , 关键是k,是什么,怎么计算//当满足 2^k >= LEN/2 , 且k最小时,这个k就是我们要的值//k可以用计算公式一步算得 : k = (int
阅读全文