藍橋杯演算法訓練 格仔操作 線段樹

2021-06-28 19:43:36 字數 1604 閱讀 1717

這題設計最基本的線段樹應用,同時考察區間和與區間最值,我採用乙個造樹函式,乙個更新函式和兩個查詢查詢函式,兩個查詢函式分別返回區間和與區間最大值。

問題描述

有n個格仔,從左到右放成一排,編號為1-n。

共有m次操作,有3種操作型別:

1.修改乙個格仔的權值,

2.求連續一段格仔權值和,

3.求連續一段格仔的最大值。

對於每個2、3操作輸出你所求出的結果。

輸入格式

第一行2個整數n,m。

接下來一行n個整數表示n個格仔的初始權值。

接下來m行,每行3個整數p,x,y,p表示操作型別,p=1時表示修改格仔x的權值為y,p=2時表示求區間[x,y]內格仔權值和,p=3時表示求區間[x,y]內格仔最大的權值。

輸出格式

有若干行,行數等於p=2或3的操作總數。

每行1個整數,對應了每個p=2或3操作的結果。

樣例輸入

4 3

1 2 3 4

2 1 3

1 4 3

3 1 4

樣例輸出6

3 資料規模與約定

對於20%的資料n <= 100,m <= 200。

對於50%的資料n <= 5000,m <= 5000。

對於100%的資料1 <= n <= 100000,m <= 100000,0 <= 格仔權值 <= 10000。

上**,道理都在注釋裡:

#include #includeusing namespace std;

int n,m,p,x,y;

long long int num[100005];//陣列元素存放處

long long int sum[100005]=;//前i個元素和,方便造樹時用

long long int father[100005];//每個陣列中元素對應線段樹中的葉結點

class node

;node nodes[400005];//4倍陣列大小的節點陣列,用來模擬線段樹

void build_tree(int i,int l,int r)//線段樹建構函式

return;

}long long int qsum(int i,int l,int r)//區間和查詢函式

{ //cout<<"ask-----"<=l&&nodes[i].rbond<=r)//若節點範圍全在查詢範圍裡

return nodes[i].sum_v;

else if(nodes[i].lbond>r||nodes[i].rbond=l&&nodes[i].rbond<=r)

return nodes[i].max_v;

else if(nodes[i].lbond>r||nodes[i].rbond

藍橋杯 演算法訓練 操作格仔 (線段樹)

演算法訓練 操作格仔 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m...

藍橋杯 演算法訓練 操作格仔 線段樹

問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m。接下來一行n個整數表示n個格仔的初始權值。接下來m行,每行3個整數p...

藍橋杯 演算法訓練 操作格仔(線段樹)

演算法訓練 操作格仔 時間限制 1.0s 記憶體限制 256.0mb 問題描述 有n個格仔,從左到右放成一排,編號為1 n。共有m次操作,有3種操作型別 1.修改乙個格仔的權值,2.求連續一段格仔權值和,3.求連續一段格仔的最大值。對於每個2 3操作輸出你所求出的結果。輸入格式 第一行2個整數n,m...