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