洛谷P3372解題報告

2021-09-25 11:24:21 字數 1085 閱讀 2438

題目描述如下:

![在這裡插入描述](

由於是一道模板題就直接給注釋詳細的**。

#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個整數,表示乙個操作,具體如下...