操作格仔 線段樹

2021-10-03 14:52:55 字數 2556 閱讀 8149

問題描述

有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。

解題思路:直接看**吧

#include

#include

#include

#include

#include

#include

#include

#include

using

namespace std;

class

treenode

public

: size_t leftedge;

size_t rightedge;

int maxval;

treenode *leftnode;

treenode *rightnode;};

class

linetree

;inline

const

int&

get_max

(const

int&a,

const

int&b)

//根據資料建立線段樹

void

creat_tree

(const vector<

int>

&nums, treenode *fathernode)

else

if(areasize ==3)

else

fathernode-

>maxval =

get_max

(fathernode-

>leftnode-

>maxval, fathernode-

>rightnode-

>maxval);}

linetree::

linetree

(const vector<

int>

&nums)

//釋放空間

void

delnode

(treenode *fathernode)

linetree::

~linetree()

//更改權值——找到葉子節點,然後向上更新最大值

void

change_val

(treenode *tnode,

const

int&pos,

const

int&val)

else

}//計算區間權值和

intfigure_sum

(const vector<

int>

&nums,

const size_t b,

const size_t e)

//查詢區間最大權值

/* 區間會有四種情況:

第一種就是剛好等於結點所表示的空間;

第二種就是被包含在結點所表示的區間的左半部分;

第三種就是右半部分;

第四種就是既在左半部分,又在右半部分。

前三種都很好解決,主要說一下第四種,結點所表示的區間的中間值記為midarea,

將指定區間[b,e]分為[b, midarea]和[midarea + 1, e],然後往下搜尋。

*/int

search_max_val

(treenode *tnode,

const size_t b,

const size_t e)

intmain()

for(

int i =

0; i < m;

++i)

}return0;

}

做完之後我去查了別人的實現方式,看到了別人是直接用陣列做的,其實我也知道可以用陣列來儲存二叉樹,但是我用得比較多的是用來儲存完全二叉樹,線段樹並不是完全二叉樹,所以對於這道題我一開始就沒想過用陣列來進行儲存,因為覺得會浪費空間,但是看了之後才發現原來對於這道題其實也是可行的,計算了一下發現其實也不會浪費多少空間,相反實現過程還簡便了許多,算是長知識了。

操作格仔 線段樹

問題描述 有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,x,y,...

藍橋杯 操作格仔 線段樹

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