演算法訓練 操作格仔

2021-09-24 00:06:43 字數 1844 閱讀 7987

問題描述

有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 31 2 3 4

2 1 3

1 4 3

3 1 4

樣例輸出63

資料規模與約定

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

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

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

//線段樹;

//申請陣列;

//1.建立線段樹;

//構造線段樹,

//2.查詢;

//3.最大值;

//建立兩個線段樹,乙個儲存最大值,乙個儲存區間和;

#include#includeusing namespace std;

#define h 100010

int t[4*h],t_sum[4*h],a[h];

int sum=0,maxn=0;

void build_tree(int root,int istart,int iend)

int mid=(istart+iend)/2;

build_tree(root*2,istart,mid);

build_tree(root*2+1,mid+1,iend);

t_sum[root]=t_sum[root*2]+t_sum[root*2+1];//儲存區間的和;

t[root]=max(t[root*2],t[root*2+1]);

return;

}void updata(int root,int start,int end,int index,int addval)

int mid=(start+end)/2;

if(index<=mid)else

t_sum[root]=t_sum[root*2]+t_sum[root*2+1];

t[root]=max(t[root*2],t[root*2+1]);

return ;

} int query_sum(int root,int start,int end,int s_start,int s_end)

int mid=(start+end)/2;

if(s_end<=mid) else if(s_start>mid) else

}int query_max(int root,int start,int end,int m_start,int m_end)

int mid=(start+end)/2;

int temp=0;

if(m_start<=mid)

if(m_end>mid)

return temp;

}int main()

build_tree(1,1,n);

for(i=0;i}

return 0;

}

演算法訓練 操作格仔

演算法訓練 操作格仔 時間限制 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...

演算法訓練 操作格仔

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