對於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打賭打...