線段樹維護區間加 乘 賦值 平方和 立方和

2022-06-03 09:48:07 字數 2292 閱讀 2965

對於x點,有加法懶標記add和乘法懶標記mul,那麼可以以以下兩種方式維護元素的值:

\(x'=(x+add)*mul\)或者\(x'=x*mul+add\)

可以證明先乘後加要比先加後乘容易維護

原來的乘、加法標記為:mul1、add1,後來要加上的乘、加法標記為:mul2、add2

x的值變為: x.dat => (x.dat * mul2) + (x.r - x.l + 1) * add2;

x的乘法標記變為: x.mul1 => x.mul1 * mul2

x的加法標記變為: x.add1 => x.add1 * mul2 + add2

在區間加乘的板子基礎上,若\(mul=0,add=c\),則代表區間賦值為c

至於維護立方和的操作,因為:

\((a+b)^3=a^3+3a^2b+3ab^2+b^3\)

所以對於利用lazy_tag維護的x值\(a*x+b\),其立方和為:

\(a^3x^3+3a^2x^2b+3axb^2+b^3\)

所以可以先更新乘法,使得x變為ax,同時更新ax下的sum1和sum2以及sum3(即\(ax,a^2x^2,a^3x^3\)),最後再利用公式進行加法的更新

hdu 4758 transformation

4個操作:

1.將a~b都加上c

2.將a~b都乘上c

3.將a~b都變成c

4.查詢a~b的每個數的p次方的和。(p=1,2,3)

#includeusing namespace std;

const int n = 1e5+5;

typedef long long ll;

const int p = 10007;

int tot, num;

int n, m, r,t,cases=0;

int w[n], a[n], sum1[n * 4], sum2[n * 4], sum3[n * 4], lazy_mul[n * 4], lazy_add[n * 4]; // w[i]=j表示時間戳為i的點的值為j,a輸入每個節點的值,dat線段樹每個點權值,lazy線段樹每個點的懶標記

vectormp[n];

void solve(int rt,int len,int a,int b)

if(a!=0)

}void pushup(int rt)

// 建線段樹,rt為根,l為rt點管轄的左邊界, r為rt點管轄的有邊界

void build(int rt, int l, int r)

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

build(rt << 1, l, mid);

build(rt << 1 | 1, mid+1, r);

pushup(rt);

}// 下傳

void pushdown(int rt, int l, int r)

// rt為根,l為rt點管轄的左邊界, r為rt點管轄的有邊界, l為需要修改的左區間,r為需要修改的右區間

void modify(int rt, int l, int r, int l, int r, int a,int b)

pushdown(rt, l, r);

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

if(l <= mid) modify(rt << 1, l, mid, l, r, a,b);

if(mid < r) modify(rt << 1 | 1, mid + 1, r, l, r, a,b);

pushup(rt);

}// rt為根,l為rt點管轄的左邊界, r為rt點管轄的有邊界, l為需要查詢的左區間,r為查詢的右區間,k代表查詢的是k次方和

int query(int rt, int l, int r, int l, int r,int k)

pushdown(rt, l, r);

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

int ans = 0;

if(l <= mid) ans += query(rt << 1, l, mid, l, r,k), ans %= p;

if(mid < r) ans += query(rt << 1 | 1, mid + 1, r, l, r,k), ans %= p;

pushup(rt);

return ans;

}int main()

else if(op == 2)

else if(op == 3)

else }}

return 0;

}

維護序列(線段樹維護區間乘 區間加)

給定乙個長度為n的原序列和模數mod,m個操作,a,b 區間乘c,a,b 區間加c,統計 a,b 的區間和。思路 線段樹維護的還是區間和,但是這裡我們需要用到兩個懶標記,乙個記錄加法,乙個記錄乘法,乘法懶標記下傳之後要重置為1而不是0。對於乙個乘法操作,他影響的是區間和還有這個區間的加法標記 乘法標...

線段樹加乘操作 求區間和和平方和

搞了整整一晚上加一下午 應該是懂了 加乘區間和別人的題解清晰易懂 這裡 平方和題目鏈結 注意 2.傳參的時候要清楚要傳的到底是什麼pushdown 1,l,r 找了很久 3.query的時候也要pushdown 因為只有這樣才能讓兒子進行完整的計算 include include define ll...

線段樹 (維護 區間平方和 Lazy標記)

外掛程式時間限制 c c 1秒,其他語言2秒 空間限制 c c 65536k,其他語言131072k 64bit io format lld 我的就是我的,你也是我的,記住了,狐狸!韓信 白龍吟 對於打賭輸了的小t會遭受到制裁,小s修改了資料庫使他可以派出許多軍隊來圍攻小t.很不幸,小t與小s打賭打...