兩個線段樹的基礎問題

2021-06-22 18:23:27 字數 1647 閱讀 6164

兩個問題,代表線段樹中最基礎的兩類:1.更新陣列裡某個值然後查詢。2.統一更新陣列中一段區間的值然後查詢。放假回來這兩天也就看到了這裡:)

為什麼要學習線段樹(個人之見):1.如果有上萬甚至更多的資料反覆查詢並更新,用這個資料結構就比較高效了。2.高階的資料結構和演算法多學些沒壞處,尤其大一大二需要注重基礎。3.想考這個證書的話需要學:)    

第一類問題,成電oj 838 母儀天下。

富庶的建業城中,有一條格格不入的長街,名曰跳蚤街,被戰爭所致的孤兒,聚集於此。全國的經濟都在為戰爭服務之時,也無人顧得了這裡了。

除了兩位夫人。

大喬小喬每天都會帶著一些食物來到跳蚤街,分給某一位孩子。為了避免分配不均,她們時常會詢問乙個區域內食物的總量,然後進行調整以保證每個孩子都有足夠的食物。

input

第一行兩個整數n,m,表示跳蚤街住著n戶孩子,大喬小喬一共分發或詢問了m次。

第二行n個整數,第i個數ai表示第i戶孩子已有ai的食物。

接下來m行,每行開始先讀入乙個整數si,指明這是一次詢問還是一次分發。

si=0,表明這是一次詢問,然後讀入兩個整數li,ri,表示詢問[li,ri]區間中的孩子們一共有多少食物。

si=1,表明這是一次分發,然後讀入兩個整數xi,wi,表示對第xi戶孩子分發了wi的食物。

1≤n,m≤100000,0≤ai≤100000,1≤xi≤n,0≤wi≤10000,1≤li≤ri≤n

output

有多少詢問就輸出多少行,每行輸出乙個整數,作為對該詢問的回答。

sample input and output

sample input                 sample output

5 4       12

1 2 3 4 5 19

1 2 3

0 2 4

1 4 1

0 1 5

#include #include using namespace std;

typedef structsegtree;

int n,m,i,j,s;

void build(segtree trees, int id, int l, int r)else

}void update(segtree trees, int id, int pos, int val)else

}int query(segtree trees, int id, int l, int r)

}int main();

int num[max];

class segtree

public:

segtree(int n)

~segtree()

void build(int l,int r,int id)

};void update(int l,int r,int c,int id)else

};__int64 query(int l,int r,int id)

}};int main(){

int n,m,a,b,c;

int cmd;

scanf("%d%d",&n,&m);

for (int i=0;i

判斷兩個線段相交

我們首先將問題分成如下幾個小問題討論 首先要解決的第乙個問題是判斷直線是否平行,我們首先假設四個點的座標為 前兩個點為a x1,y1 b x2,y2 後兩個點為 c x3,y3 d x4,y4 求出兩個直線的方向向量e1 x 1 x2 y1 y2 e2 x 3 x4 y3 y4 通過e 1 e2 求...

線段交(幾何問題判斷兩個線段是否有交點)

題目描述 給定n個線段。求有交點的線段對數。保證沒有兩條線段共線 輸入一行乙個整數n,表示線段的個數 第2 n 1行,每行四個實數,x1,y1,x2,y2,表示線段的兩個端點 x1,y1 和 x2,y2 輸出一行乙個整數,表示有交點的線段對數。3 0.00 0.00 1.00 1.00 0.00 1...

判斷兩個線段是否相交

html xmlns lang en charset utf 8 判斷兩個線段是否相交問題title rel stylesheet href css reset.css rel stylesheet href css style.css head class wrap 判斷兩個線段是否相交h2 br...