線段樹 效率至上

2021-08-04 12:28:32 字數 1293 閱讀 5245

效率至上

time limit: 5000ms memory limit: 65536kb

submit statistic

problem description

題意很簡單,給出乙個數目為n的非有序序列,然後有m次查詢.對於每次查詢輸入兩個正整數l,r請輸出區間[l,r]的最大值與最小值的差值

input

第一行:輸入兩個正整數n,m (1<=n<=50000, 1<=m<=200000 );

第二行:輸入n個整數 大小範圍為[1,100000];

接下來的m行,每次兩個正整數l,r (1<=l<=r<=n);

output

輸出區間[l,r]最大值與最小值的差值.

example input

6 3

1 7

3 4

2 5

1 5

4 6

2 2

example output

6 3

0 hint

author

think:

線段樹是乙個完全二叉樹,查詢的時間複雜度無o(lgn).

性質:

父親區間【a, b】

左兒子【a, (a+b)/2】

右兒子【(a+b)/2+1, b】

儲存空間大小為樹狀陣列的四倍。

*能用樹狀陣列做的題目,用線段樹基本都可以做;

*能用線段樹做的題目,不一定可以用樹狀陣列做;

————-線段樹用處比較廣泛。

#include 

#include

#define maxn 200033

int max(int a, int b)

int min(int a, int b)

void minm(int n)//更新最小值

void buildtree(int l, int r, int n)//建樹

intm = (l + r)/2;

buildtree(l, m, n*2);

buildtree(m+1, r, n*2+1);

maxm(n);

minm(n);

}int findmin(int l,int r, int l, int r, int n)/*查詢最小值*/

int findmax(int l, int r, int l, int r, int n)/*查詢最大值*/

int main()

return

0;}

線段樹 SDUT3302效率至上

題意 題意很簡單,給出乙個數目為n的非有序序列,然後有m次查詢.對於每次查詢輸入兩個正整數l,r請輸出區間 l,r 的最大值與最小值的差值 輸入 第一行 輸入兩個正整數n,m 1 n 50000,1 m 200000 第二行 輸入n個整數 大小範圍為 1,100000 接下來的m行,每次兩個正整數l...

sdutacm 效率至上

time limit 5000ms memory limit 65536kb submit statistic problemdescription 題意很簡單 給出乙個數目為 n的非有序序列 然後有 m次查詢 對於每次查詢輸入兩個正整數 l,r請輸出區間 l,r 的最大值與最小值的差值 input...

SDUT3302效率至上

problem description 題意很簡單,給出乙個數目為n的非有序序列,然後有m次查詢.對於每次查詢輸入兩個正整數l,r請輸出區間 l,r 的最大值與最小值的差值 input 第一行 輸入兩個正整數n,m 1 n 50000,1 m 200000 第二行 輸入n個整數 大小範圍為 1,10...