洛谷P3372 線段樹模板

2021-10-21 17:44:41 字數 1993 閱讀 7766

線段樹講的很詳細的部落格:

鏈結

#includeusing namespace std;

typedef long long ll;

const int maxn = 100005;

ll dat[maxn];//儲存資料

ll tree[maxn<<2];//儲存線段樹的陣列常開成資料的4倍大小

ll add[maxn<<2];//用來標記區間加減的操作

void pushup(int node)//用於更新線段樹的每個結點,在這裡的含義是區間和的合併

void build(int l,int r,int node)//建樹

int mid=(l+r)>>1;

build(l,mid,node<<1);//遞迴建立左子樹

build(mid+1,r,node<<1|1);//遞迴建立右子樹

pushup(node);//更新結點資訊

}void point_update(int l,int r,int node,int dat_i,int c)//這是點修改函式,dat_i是dat陣列的下標,作出某種改變用到的數值

int mid=(l+r)>>1;

if(dat_i<=mid) point_update(l,mid,node<<1,dat_i,c);//根據條件判斷應該往左子樹呼叫還是往右子樹呼叫

else point_update(mid+1,r,node<<1|1,dat_i,c);

pushup(node);//子節點更新,路徑上的節點都應該更新

}void pushdown(int node,int ln,int rn)//這是下推懶惰標記(即延時標記,是一種暫時不處理,等到用到的時候再進行處理的思想)函式,ln,rn是左子樹、右子樹對應的線段長度,這個函式的作用是下推標記實現區間修改 }

void interval_update(int l,int r,int node,int start,int end,int c)//這是區間修改函式,更新從start到end的值

int mid = (l+r)>>1;

pushdown(node,mid-l+1,r-mid);//下推標記,即對下面的節點進行修改

//根據條件判斷往哪個方向進行遞迴

if(start<=mid) interval_update(l,mid,node<<1,start,end,c);

if(end>mid) interval_update(mid+1,r,node<<1|1,start,end,c);

pushup(node);//更新節點

}ll query(int l,int r,int node,int start,int end)//區間詢問函式

int mid=(l+r)>>1;

pushdown(node,mid-l+1,r-mid);//下推標記確保sum正確

//統計答案

ll ans=0;

//根據條件選擇遞迴方向

if(start<=mid) ans+=query(l,mid,node<<1,start,end);

if(end>mid) ans+=query(mid+1,r,node<<1|1,start,end);

return ans;

}int main()

build(1,n,1);//建樹

for(int i=1;i<=m;++i)

else

}return 0;}/*

5 51 5 4 2 3

2 2 4

1 2 3 2

2 3 4

1 1 5 1

2 1 4118

20*/

線段樹模板(洛谷P3372)

給定序列,支援區間加 求區間和。線段樹的基本思路 線段樹模板嘛,不懂得看題解第一,dalao講解超詳細的 includeusing namespace std define ll long long int maxn 1000001 unsigned ll n,m,a maxn ans maxn 2...

洛谷 P3372 線段樹 模板1

模板一是區間加修改和區間和 例題 如下 include includeusing namespace std struct tree int rt 1,cnt 2 int n,i,m const int maxa 100000 tree tree maxa 1 結構體模擬線段樹 long long ...

洛谷 P3372 模板 線段樹 1

題目描述 如題,已知乙個數列,你需要進行下面兩種操作 1.將某區間每乙個數加上x 2.求出某區間每乙個數的和 輸入格式 第一行包含兩個整數n m,分別表示該數列數字的個數和操作的總個數。第二行包含n個用空格分隔的整數,其中第i個數字表示數列第i項的初始值。接下來m行每行包含3或4個整數,表示乙個操作...