luogu3373 模板 線段樹 2

2021-08-19 05:37:58 字數 1174 閱讀 8565

題面

已知乙個數列,你需要進行下面三種操作:

1.將某區間每乙個數乘上x

2.將某區間每乙個數加上x

3.求出某區間每乙個數的和

題解區間修改+區間查詢。

維護兩個lazytag

#include

#include

using

namespace

std;

const

int maxn = 100010;

typedef

long

long ll;

int n, m;

ll a[maxn],mod;

struct nodesgt[maxn<<2];

void build(int p, int l, int r)else

sgt[p].val %= mod;

}void pushdown(int p)

void add(int p, int l, int r, ll v)

pushdown(p);

int m = (sgt[p].l+sgt[p].r)/2;

if(l <= m)add(p*2,l,r,v);

if(r > m)add(p*2+1,l,r,v);

sgt[p].val = (sgt[p*2].val+sgt[p*2+1].val)%mod;

}void times(int p, int l, int r, ll v)

pushdown(p);

int m = (sgt[p].l+sgt[p].r)/2;

if(l <= m)times(p*2,l,r,v);

if(r > m)times(p*2+1,l,r,v);

sgt[p].val = (sgt[p*2].val+sgt[p*2+1].val)%mod;

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

int main()else

if(op == 2)else

}return

0;}

寫的時候偷懶直接複製加法函式到乘法然後改。。。結果忘記改遞迴的地方了,調了半個多小時調不出來。

luogu 3373 模板 線段樹2

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

Luogu3373 模板 線段樹 2

不寫線段樹,就是要分塊!同樣需要打標記 在任何時候,a i mul times a i add bel i 表示 i 屬於哪一塊,a i 表示第 i 個位置的真實值 但是由於標記都是整塊整塊打上去的,無法單點修改,本來可能還可以利用逆元強行修改,問題是 p 571373 不是質數,那麼如何處理零散的...

luogu3373 模板 線段樹2

題目大意 已知乙個數列,你需要進行下面三種操作 1.將某區間每乙個數乘上x 2.將某區間每乙個數加上x 3.求出某區間每乙個數的和 本線段樹的標記是個二元組 add和mul,其代表將乙個線段中的每乙個點乘以mul再加add。設區間長度為x,原來區間和為sum。如果兩個標記要疊加,標記疊加前區間上的和...