兩個問題,代表線段樹中最基礎的兩類: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 121 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...