題目描述如下:
![在這裡插入描述](
由於是一道模板題就直接給注釋詳細的**。
#include#includeusing namespace std;
typedef long long ll;
long long int sum=0ll;
struct node
tree[500005];
void build(ll l,ll r,ll k)
int mid=(l+r)/2;//二分法生成樹
build(l,mid,k*2);
build(mid+1,r,k*2+1);
tree[k].v=tree[k*2].v+tree[k*2+1].v;//由於是返回,所以先更改的是子節點的值。
//父節點等於兩個子節點(區間)值的和
}void passdown(ll k)
void add(ll p,ll q,ll k,ll w)
if(tree[k].f)//如果已經找到尋找的區間之一
passdown(k);//由於之前只把懶惰標記傳遞到了要用點便停止,他的子節點的值並未改變所以要下傳懶惰標記。
ll mid=(tree[k].l+tree[k].r)/2;//二分搜尋
if(p<=mid)add(p,q,k*2,w);
if (q>mid) add(p,q,k*2+1,w);
tree[k].v=tree[k*2].v+tree[k*2+1].v;//返回時改變父節點的值。
}void sear(ll p,ll q,ll k)
if(tree[k].f)
passdown(k);//由於之前只把懶惰標記傳遞到了要用點便停止,他的子節點的值並未改變所以要下傳懶惰標記。
long long int mid=(tree[k].l+tree[k].r)/2;
if(p<=mid) sear(p,q,k*2);
if(q>mid) sear(p,q,k*2+1);
}int main() }
return 0;
}
洛谷 P3372 線段樹 1
今天植樹節,來種一棵線段樹。傳送門如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第 i 個數字表示數列第 i 項的初始值。接下來m行每...
洛谷P3372 線段樹模板
線段樹講的很詳細的部落格 鏈結 includeusing namespace std typedef long long ll const int maxn 100005 ll dat maxn 儲存資料 ll tree maxn 2 儲存線段樹的陣列常開成資料的4倍大小 ll add maxn 2...
線段樹1 洛谷P3372
如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作,具體如下...