思路:要設定加法標記和乘法標記, 先加後乘和先乘後加是不一樣的,
先加後乘 :
比較一下,發現,上面的先加後乘相當於下面的式子,在加法上面多乘了乙個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...