HD1754 I Hate It 線段樹基礎

2021-06-26 15:24:53 字數 2438 閱讀 5769

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。

這讓很多學生很反感。

不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。

本題目包含多組測試,請處理到檔案結束。

在每個測試的第一行,有兩個正整數 n 和 m ( 0

學生id編號分別從1編到n。

第二行包含n個整數,代表這n個學生的初始成績,其中第i個數代表id為i的學生的成績。

接下來有m行。每一行有乙個字元 c (只取'q'或'u') ,和兩個正整數a,b。

當c為'q'的時候,表示這是一條詢問操作,它詢問id從a到b(包括a,b)的學生當中,成績最高的是多少。

當c為'u'的時候,表示這是一條更新操作,要求把id為a的學生的成績更改為b。

對於每一次詢問操作,在一行裡面輸最高成績

5 61 2 3 4 5

q 1 5

u 3 6

q 3 4

q 4 5

u 2 9

q 1 5

output5

6 5

9 經典而又基礎的線段樹題目吧!(ps:個人認為)

線段數:

線段樹是一種

二叉搜尋樹,與

區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。

使用線段樹可以快速的查詢某乙個節點在若干條線段中出現的次數,時間複雜度為o(logn)。而未優化的

空間複雜度為2n,因此有時需要離散化讓空間壓縮。

線段樹是一種

二叉搜尋樹,與

區間樹相似,它將乙個區間劃分成一些單元區間,每個單元區間對應線段樹中的乙個葉結點。

對於線段樹中的每乙個非

葉子節點[a,b],它的左兒子表示的區間為[a,(a+b)/2],右兒子表示的區間為[(a+b)/2+1,b]。因此線段樹是

平衡二叉樹,最後的子節點數目為n,即整個線段區間的長度。

ps:鑑於實在不會表達,文中多數話為直接copy的

其實線段樹的原理很好理解,但**的實現確實費了不少功夫!

樹的結構:

truct stree

num[800005];

// 線段樹的**實現靠的是程式的遞迴

樹的建立:

int  bulid(int left,int rigth,int node)//從節點最上層遞迴到最下層,最下層即單個數值

mid=(left+rigth)/2;

return num[node].max=mmax(bulid(left,mid,2*node),bulid(mid+1,rigth,2*node+1));//遞迴的公式層層往下遞迴,在往上遞迴

}// mmax 求兩個數較大數的函式

樹的查詢:

int find(int left,int rigth,int node)

}

樹的更新:

void update(int id,int x,int node)

else

}

以上是與本題有關的關於線段樹的**,實際的通用**畢竟要根據題意而改變,所以直接引用

ac**附上:

#include #include int head[200005];

struct stree

num[800005];

// 線段樹的**實現靠的是程式的遞迴

int mmax(int x,int y)

int bulid(int left,int rigth,int node)//從節點最上層遞迴到最下層,最下層即單個數值

mid=(left+rigth)/2;

return num[node].max=mmax(bulid(left,mid,2*node),bulid(mid+1,rigth,2*node+1));//遞迴的公式層層往下遞迴,在往上遞迴

}int find(int left,int rigth,int node)

}void update(int id,int x,int node)

else

}int main()

{ int n,m;

int i,j;

int a,b;

char c;

while(~scanf("%d%d",&n,&m))

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

scanf("%d",&head[i]);

bulid(1,n,1);

for(i=0;i

hdu 1754 I Hate It (線段樹版)

讀入的時候因為要先輸入字元c,所以要用getchar 和輸入時的 c處理掉空格,很煩,不按字元輸入而是 s輸入字串可避免這個問題 include include using namespace std define lson l,m,rt 1 define rson m 1,r,rt 1 1 def...

hdu1754 I Hate It 線段樹模板

很多學校流行一種比較的習慣。老師們很喜歡詢問,從某某到某某當中,分數最高的是多少。這讓很多學生很反感。不管你喜不喜歡,現在需要你做的是,就是按照老師的要求,寫乙個程式,模擬老師的詢問。當然,老師有時候需要更新某位同學的成績。本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個正整數 n ...

HDU 1754 I Hate It 線段樹模板

本題目包含多組測試,請處理到檔案結束。在每個測試的第一行,有兩個正整數 n 和 m 0多組測試,存在單點更新和區間查詢,維護區間最大值,不需要加標記,普通的線段樹模板。include include include include include using namespace std const ...