随笔分类 - RMQ_ST
摘要:T^T做这题就是各种泪~卡了将近2小时,各种Judging error、越界与WA。题解:整个数组是非降序的,所有相等元素都会聚集在一起。开一个num数组,用num[i]来记录第i段相等的元素有多少个(也就是说相当于RMQ中的元素值了),num数组的长度就是原数列不同元素的个数(段数),l数组记录i段元素的上界,r数组记录i段元素的下界,用一个mark数组记录i位置的元素属于第几段。假设询问区间为a,b:L=mark[a],R=mark[b];ans=max(r[L]-a+1,b-l[R]+1,夹在这两个段中最大值)图解:#include<iostream>#include<
阅读全文
摘要:很裸的RMQ~#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;#define MAXN 50005int maxsum[MAXN][20],minsum[MAXN][20],n,q;void RMQ(){ for(int j=1;(1<<j)<=n;++j) for(int
阅读全文
摘要:RMQ问题:用典型的ST算法可过。#include<iostream>#include<cstdio>#include<cstring>#include<cmath>#include<algorithm>#include<string>#include<queue>using namespace std;#define MAXN 100010 int maxsum[MAXN][18],minsum[MAXN][18],n;void RMQ(){ for(int j=1;(1<<j)<=n;++
阅读全文
摘要:RMQ:范围最小值问题。给出一个n个元素的数组A1,A2,...,An,设计一个数据结构支持查询操作Query(L,R):计算min{AL,AL+1,...,AR}。每次用一个循环来求最小值显然不够快快,前缀和的思想也不能提高效率,这时候ST算法就派上用场了,它预处理的时间是O(nlogn),但是查询只需要Q(1),而且常数很小。令dp[i][j]表示从i开始的,长度为2^j的一段元素中的最小值,递推公式:dp[i][j]=min{dp[i][j-1],dp[i+2^(j-1)][j-1]}模板:(^ ^一次预处理,一辈子不用担忧)void RMQ_init(const vector<i
阅读全文
浙公网安备 33010602011771号