P3373 線段樹(區間更新 求和)

2021-09-24 05:31:03 字數 2194 閱讀 2759

思路:要設定加法標記和乘法標記, 先加後乘和先乘後加是不一樣的,

先加後乘 :

比較一下,發現,上面的先加後乘相當於下面的式子,在加法上面多乘了乙個c,所以,我們只要是先加後乘的式子,只要加乙個*c就可以轉化為先乘後加的式子,具體的操作就是在新增乘法標記的時候,把加法標記*c就好了,可以寫兩個更新函式,也可以寫乙個,乘法:

乙個函式版本:

#include using namespace std;

#define ll long long

#define mid (l + r) >> 1

#define lefs l, m, rt << 1

#define rigs m + 1, r, rt << 1 | 1

#define lef rt << 1

#define rig rt << 1 | 1

#define abb int l, int r, int rt

const int n = 1e5 + 7;

int n, m, k, p;

ll sum[n << 2], lazy_add[n << 2], lazy_mul[n << 2];

void push_up(int rt)

void push_down(abb)

}void build(abb)

int m = mid;

build(lefs); build(rigs);

push_up(rt);

}void update(int l, int r, ll x, ll y, abb)

push_down(l ,r, rt);

int m = mid;

if(m >= l) update(l, r, x, y, lefs);

if(m < r) update(l, r, x, y, rigs);

push_up(rt);

}ll query(int l, int r, abb)

int main()

else if(op == 2)

else}}

兩個函式版本:

#include using namespace std;

#define ll long long

#define mid (l + r) >> 1

#define lefs l, m, rt << 1

#define rigs m + 1, r, rt << 1 | 1

#define lef rt << 1

#define rig rt << 1 | 1

#define abb int l, int r, int rt

const int n = 1e5 + 7;

int n, m, p;

ll sum[n << 2], lazy_add[n << 2], lazy_mul[n << 2];

void pushup(int rt)

void pushdown(abb)

}void build(abb)

int m = mid;

build(lefs); build(rigs);

pushup(rt);

}void update_mul(int l, int r, ll val, abb)

pushdown(l, r, rt);

int m = mid;

if(m >= l) update_mul(l, r, val, lefs);

if(m < r) update_mul(l, r, val, rigs);

pushup(rt);

}void update_add(int l, int r, ll val, abb)

pushdown(l, r, rt);

int m = mid;

if(m >= l) update_add(l, r, val, lefs);

if(m < r) update_add(l, r, val, rigs);

pushup(rt);

}ll query(int l, int r, abb)

int main()

else if(op == 2)

else}}

P3373 線段樹模板

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

P3373 模板 線段樹2

如題,已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 include include using namespace std const int maxn 100005 int n,m,p long long arr maxn...

P3373 模板 線段樹 2

ac 這裡的延遲標記要開兩個,分別記錄加法的值和乘法的值,但是乘法和加法的優先順序不一樣,不規定他們的順序的話會有錯誤,所以可以規定乘法優先,即規定好該結點的值等於該節點的值 父節點的乘法延遲標記的值 父節點加法延遲標記的值 區間長度,即,sum num 2 sum num 2 add num wc...