九度 1544 數字序列區間最小值 樸素線段樹

2021-09-06 14:04:35 字數 1781 閱讀 1778

題目

給定乙個數字序列,查詢任意給定區間內數字的最小值。

思路

1. 第一反應, 這是在考察 線段樹

, 鏈結裡的 blog 講的很不錯, 清晰易懂

2. 這道題不需要考慮插入或者刪除線段, 只需要 build 和 統計

3. 建樹的話, 先考慮 node 節點的設計, 題目要求的是區間最小值, 所以自然需要乙個域保留當前 node 節點表示區間的最小值.

class

node ;

4. 然後進行遞迴建樹. 區間 [a,b]的最小值 是由 [a,mid] 和 [mid+1, b] 確定的, 典型的後序遍歷模式

node* buildtree(int a, int

b)

int mid = (a+b) >> 1

; node* lnode =buildtree(a, mid);

node* rnode = buildtree(mid+1

, b);

node* newnode = new

node();

newnode->left =a;

newnode->right =b;

newnode->lchild =lnode;

newnode->rchild =rnode;

newnode->minval = min(lnode->minval, rnode->minval);

return

newnode;

}

ok, 樹建好了, 現在, 我們擁有這個樣子的樹了

5. 最後進行統計

統計是乙個 topdown 的搜尋過程, log(n) 時間複雜度

遞迴的退出條件是 a = left, b = right

int search(node* root, int a, int

b) else}}

**

#include #include 

using

namespace

std;

const

int infs = 0x3f3f3f3f

;class

node ;

int arr[200000

];node* buildtree(int a, int

b)

int mid = (a+b) >> 1

; node* lnode =buildtree(a, mid);

node* rnode = buildtree(mid+1

, b);

node* newnode = new

node();

newnode->left =a;

newnode->right =b;

newnode->lchild =lnode;

newnode->rchild =rnode;

newnode->minval = min(lnode->minval, rnode->minval);

return

newnode;

}int search(node* root, int a, int

b) else

}}int

main()

}return0;

}

九度oj 題目1544 數字序列區間最小值

題目描述 給定乙個數字序列,查詢任意給定區間內數字的最小值。輸入 輸入包含多組測試用例,每組測試用例的開頭為乙個整數n 1 n 100000 代表數字序列的長度。接下去一行給出n個數字,代表數字序列。數字在int範圍內。下一行為乙個整數t 1 t 10000 代表查詢的次數。最後t行,每行給出乙個查...

Number Sequence 數字序列

一 杭電原題摘錄 二.題目分析 很容易就能想到遞迴,但是超出記憶體 int fac int a,int b,int n 超出記憶體 因為f n 的值要對7取餘,所以不難想到f n 的值可能存在週期.那我們就去找週期,看是否存在?週期不就是一直重複t個數,那麼我們就說這組數存在週期,且為t.在這個問題...

解碼數字序列

問題 大意 指定26個字元的編碼方式,即a對應1,b對應2,以此類推,z對應26,現出一串數字序列,問有多少種方式能對其進行解碼 實際上是乙個簡單的動態規劃,設s是我們要解碼的數字序列,令dp i 表示s i,s.length 有多少種解碼方式,則狀態方程為 if s i 0,dp i 0 else...