加法乘法線段樹模板

2022-02-06 05:52:11 字數 1175 閱讀 3664

p2023 [ahoi2009]維護序列

指定乙個區間 加上或者乘以 v,

查詢乙個區間所有元素和%p

與純加法線段樹不同的是,lazy_tag 的傳遞

(x + y) * v = xv + yv。

所以每次乘法,都要把加法的lazy_tag * v

而加法與加法線段樹的操作一樣

#include #include typedef long long ll;

using namespace std;

const int maxn = 100005 + 5;

ll n, p, m;

ll a[maxn];

struct seg t[maxn << 2];

ll lch(ll k) ;

ll rch(ll k) ;

inline void add(ll& a, ll b) ;

inline void mul(ll& a, ll b) ;

void push_up(ll k) ;

void push_down(ll k)

void build(ll k, ll l, ll r)

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

build(lch(k), l, mid);

build(rch(k), mid + 1, r);

push_up(k);

}void update(ll k, ll l, ll r, ll v, ll f)

else

return;

} push_down(k);

if (t[lch(k)].r >= l) update(lch(k), l, r, v, f);

if (t[rch(k)].l <= r) update(rch(k), l, r, v, f);

push_up(k);

}ll query(ll k, ll l, ll r)

int main()

build(1, 1, n);

ll a, b, c, d;

cin >> m;

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

else if (a == 2)

else

} return 0;

}

線段樹加法和乘法

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

ccf除法 線段樹模板

這題的要求是對區間處理,查詢區間和,一看就是線段樹模板題,下面是 includeusing namespace std int pp 100001 struct qp 2000001 void build int l,int r,long long x 建樹函式 int m l r 2 build ...

洛谷P3373 線段樹2 乘法加法模板線段樹

這個模板題可真是有點意思。重點在lazytag上,加上乘法操作的tag。update乘的時候要把加的標記也乘一下!下放標記的時候也要記得先乘後加!include include define maxn 1000001 define ll long long using namespace std u...