/*
translation:
给出一列数列,按照不递减的顺序。并且给出若干查询操作,查询某一区间出现频率最频繁的次数是多少?
solution:
RMQ的ST算法
首先设置数组dp[i][j]表示从i开始长度为2^i次方的查询结果。则根据动态规划有:
dp[i][j] = max(dp[i][j-1], dp[i+(len >> 1)][j-1])。
然后根据数据不递减的特点,可以将其“游标编程”。并且在查询时对两端的点进行单独判断。然后按照ST的
查询操作即可。
note:
*: 习得ST算法解决RMQ的正确姿势ORZ
date:
2016.11.16
*/
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 100000 + 5;
int n, q;
int a[maxn];
int pos[maxn], p;
int Left[maxn], Right[maxn];
int dp[maxn][50];
void RMQ_init()
{
memset(dp, 0, sizeof(dp));
for(int i = 0; i <= p; i++) dp[i][0] = Right[i] - Left[i] + 1;
for(int j = 1; (1 << j) <= p; j++){
int len = 1 << j;
for(int i = 0; i + len - 1 <= p; i++)
dp[i][j] = max(dp[i][j-1], dp[i+(len >> 1)][j-1]);
}
}
int query(int L, int R)
{
int k &#
poj3368(RMQ,ST算法)
该博客介绍了一种利用ST算法解决区间最频繁出现次数查询的问题。通过动态规划设置dp数组,并根据数据的非递减特性进行优化,实现RMQ(Range Minimum Query)的高效查询。代码中展示了具体的实现过程。
摘要由CSDN通过智能技术生成