RMQ求區間最大頻率

2021-08-18 02:20:00 字數 1924 閱讀 6730

暫時只做了遞增序列的求解方法,就是將原數列處理成個數的陣列,類似於字首和的東西,對這個頻率陣列求區間最大值,

但是僅僅維護區間max還是不夠的,,好比這種情況:

原數列:     1 1 1 2 3 5 5 7 7 

頻率陣列:  1 2 3 1 1 1 2 1 2 

下標:         1 2 3 4 5 6 7 8 9

如果查詢區間3~5,頻率陣列分別為3 1 1這樣,max就是3明顯不對,這時加一種處理,去掉開始的重複部分,就是保證查詢區間的第乙個數的頻率陣列權值為1。詳情見**:

ac**:

#include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #pragma comment(linker, "/stack:1024000000,1024000000")

using namespace std;

//#define maxd 1010

#define lson l , m , rt << 1

#define rson m + 1 , r , rt << 1 | 1

#define mc(x, y) memcpy(x, y, sizeof(x))

#define ms(x,y) memset(x,y,sizeof(x))

#define rep(i,n) for(int i=0;i<(n);i++)

#define repf(i,a,b) for(int i=(a);i<=(b);i++)

#define fi first

#define se second

#define it iterator

#define pb push_back

#define times 10

typedef long long ll;

typedef unsigned long long ull;

typedef long double ld;

typedef pairpce;

//#define n 100

const double eps = 1e-10;

const double pi = acos(-1.0);

const ll mod = 1e9+7;

const int inf = 0x3f3f3f3f;

//const ll inf = (ll)1e18+300;

const int maxd = 100500 + 10;

int n;

int q;

int ac[maxd];

int max_[maxd][20];

int min_[maxd][20];

int pre[maxd];

void rmq()

for (int j = 1; j <= 20; j++) }}

}int main()

//sort(ac+1, ac+1+n);

for (int i = 1; i <= n; i ++)

if(ac[i] == ac[i - 1])

else

}rmq();

for (int i = 1; i <= q; i++)

int res = temp - a;

a = temp;

if(a <= b)

else }}

}

RMQ求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 所以是乙個很快速的演算法,當然這個問題用線段樹同樣能夠解決。問題 給出n個數ai,讓你快速查詢某個區間的的最值。一 首先是預處理,用動態規劃 dp 解決。設a i 是要求區間最值的數列,f i,j 表示從...

RMQ 求區間最值

rmq演算法,是乙個快速求區間最值的離線演算法,預處理時間複雜度o n log n 查詢o 1 概念 rmq range minimum maximum query 即區間最值查詢,是指這樣乙個問題 對於長度為n的數列a,回答若干詢問rmq a,i,j i,j n 返回數列a中下標在i,j之間的最小...

模板 RMQ求區間最值

rmq簡單來說就是求區間的最大值 最小值 核心演算法 動態規劃 rmq 以下以求最大值為例 f i,j 表示 從 i 開始 到i 2j 1這個區間中的最大值 狀態轉移方程 f i,j max f i,j 1 f i 2 j 1,j 1 我們可以把區間 i,i 2j 1 平均分為兩個區間,因為j 1的...