華為機試 線段樹

2021-10-07 17:43:36 字數 2317 閱讀 7307

輸入描述:

輸入包括多組測試資料。

每組輸入第一行是兩個正整數n和m(0 < n <= 30000,0 < m < 5000),分別代表學生的數目和操作的數目。

學生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。

輸出描述:

對於每一次詢問操作,在一行裡面輸出最高成績.
輸入例子1:

5 7

1 2 3 4 5

q 1 5

u 3 6

q 3 4

q 4 5

u 4 5

u 2 9

q 1 5

輸出例子1:

565

9

思路:包含典型的區間快速查詢 和 修改操作

傳統的遍歷查詢思路複雜度 o(n)級別

線段樹 犧牲空間複雜度 其中樹節點描述為:   [left   right]區間  區間內最大值

struct node

;

採取build遞迴思路建立原始arr陣列的 tree線段樹

int arr[30001];//存放成績

node  tree[120000];//線段樹節點

void build(int num,int left,int right)  //以原始arr區間[left right] 構建到以num為根節點的 線段樹上

int mid=(left+right)>>1;

build(num*2,left,mid);

build(num*2+1,mid+1,right);//左右子樹

tree[num].max=max(tree[num*2].max,tree[num*2+1].max);//取較大值

}

線段樹更新操作,先遞迴下降到最終葉子結點,在返回過程中修改包含該節點區間的max值     複雜度o(lgn)級別

void update(int num,int k,int new_data)  //從tree[num]根節點的線段樹開始  更新arr[k]的值為new_data

}//同時 遞迴返回 修改包含這個節點的 線段

int mid=(tree[num].left+tree[num].right)>>1;

if(k<=mid) //需要進入左子樹

update(num*2,k,new_data);

else

update(num*2+1,k,new_data);

//返回後

tree[num].max=max(tree[num*2].max,tree[num*2+1].max);//更新該節點的 最大值

}

線段樹查詢操作 (查詢區間內最大值) 傳統思路o(n)複雜度   線段樹o(lgn)複雜度

int my_max=-1;

void query(int start,int end,int num) //查詢array 區間[start end]之間的最大值 從線段樹tree[num]開始

if(tree[num].left>=start && tree[num].right<=end) //該線段樹被包含在查詢區間內 那麼更新max

int mid=(tree[num].left+tree[num].right)>>1;

if(start<=mid) //需要進一步訪問左子樹

query(start,end,num*2);

if(end>mid) //需要進一步訪問右子樹

query(start,end,num*2+1);

}

主函式:

int main()

build(1,1,n);//從tree[1]開始構建以arr[1 n]的線段樹

for(int i=0;i>opera;

cin>>a>>b;

if(opera=='u') //更新操作

else}}

}

華為機試 最高分是多少(線段樹)

老師想知道從某某同學當中,分數最高的是多少,現在請你程式設計模擬老師的詢問。當然,老師有時候需要更新某位同學的成績.輸入描述 輸入包括多組測試資料。每組輸入第一行是兩個正整數n和m 0 n 30000,0 m 5000 分別代表學生的數目和操作的數目。學生id編號從1編到n。第二行包含n個整數,代表...

華為機試整理

include stdafx.h includeusing namespace std int main int argc,tchar argv cout 2.大數相加 用stl的string比較方便,如下,自己測了幾組資料沒有什麼問題。include stdafx.h include includ...

華為機試 2013

1.字串轉換 問題描述 將輸入的字串 字串僅包含小寫字母 a 到 z 按照如下規則,迴圈轉換後輸出 a b,b c,y z,z a 若輸入的字串連續出現兩個字母相同時,後乙個字母需要連續轉換2次。例如 aa 轉換為 bc,zz 轉換為 ab 當連續相同字母超過兩個時,第三個出現的字母按第一次出現算。...