ACM常用模板 資料結構 區間最值查詢RMQ

2021-07-07 06:28:11 字數 3700 閱讀 9108

(一)基於st的rmq
#include

#include

#include

using

namespace

std;

const

intmaxn

=100005

; intdp[

maxn

][20],a

[maxn],n

,m; //s陣列下標從0開始

void

init_rmq

()

intrmq(

intl

,intr)

void

init_rmq_index

()

intrmq_index

(intl,

intr

)

intmain

()

}

return0;

}

(二)基於線段樹的rmq
#include

#include

#include

#define

lson l,m

,rt<<

1 #define

rson m+1

,r,rt

<<1|

1 using

namespace

std;

const

intmaxn

=100005

; inta[

maxn

],min

[maxn

<<2],

n;void

pushup

(intrt)

void

build

(intl,

intr

,intrt)

intm=(l

+r)>>1;

build

(lson

); build

(rson

);

pushup(rt

); }

intquery

(intl,

intr

,intl,

intr

,intrt)

intmain

()

}

return0;

}

(三) 最長回文 hdu3068

模型:給出乙個只由小寫英文本元a,b,c...y,z組成的字串s,求s中最長回文串的長度.

1.字尾陣列解法

#define

ll long

long

#define

lson l,m

,rt<<

1

#define

rson m+1

,r,rt

<<1|

1

using

namespace

std;

const

intmaxn

=400005

,maxe

=100005

,inf=1

<<

29;

intn,

m,k;

int

rank

[maxn

],tmp

[maxn

],sa

[maxn

],height

[maxn

];

chars[

maxn

],s1

[maxn

];

intdp[

maxn

][30

];

bool

cmp(

inti

,int

j)

}

void

get_sa

()

for(k=

1;k<=n;

k*=2)

}

void

get_lcp

()

}

void

initrmq

()

int

rmq(

intl

,int

r)

int

main

()

for(

inti=1

;ii++)

printf

("%d\n"

,ans

);

}

return

0;

}

//abracadabra

2.manacher演算法

#include

#include

using

namespace

std;

const

intmaxn

=400005

;

chars[

maxn

],str

[maxn

];

intp[

maxn

];

void

init

()

int

manacher

()

return

ans-

1;

}

int

main

()

return

0;

}

資料結構 二 RMQ 區間最值查詢

rmq 和普通陣列的區別是 rmq 是二維陣列,維度為 其中 rmq i j rmq i j rmq i j 表示的是從 a i a i a i 開始長度為 2 j2 j 2j的區間的最小值,那麼顯然,它的初始化可以遞迴進行,且複雜度為 o n logn o nlogn o nlog n 當要查詢 ...

RMQ 區間最值 模板

rmq 的全稱為range max min query。構造dp陣列的時間為o nlogn 但是查詢時間為o 1 所以當資料量小於logn時,用樸素遍歷找最值就好,但是請求次數大於logn時,就要用這個模板。利用動態規劃的思想。int order maxn 使每乙個2 order i i 2 ord...

區間最值的優秀資料結構 ST表

st表,聽起來高大上,實際上限制非常多,僅僅可以求最值問題 為什麼?先從原理看起 st表運用了倍增的思想 st i j min st i j 1 st i 2 j 1 j 1 意義是 從i開始向後連續2 j個位置的最大值是,i開始向後連續2 j 1 個位置的最大值和i 2 j 1 開始向後連續2 j...