對於乙個區間有4個操作:
1.將a~b都加上c
2.將a~b都乘上c
3.將a~b都變成c
4.查詢a~b的每個數的p次方的和。(p=1,2,3)
平方和這樣來推:\((a+c)^2=a^2+2ac+c^2\)
即\(sum2[rt] = sum2[rt] +2*sum1[rt] * c+(r-l+1)*c*c\);
立方和這樣推:\((a+c)^3=a^3+3a^2c+3ac^2+c^3\)
即\(sum3[rt]=sum3[rt]+3*sum2[rt]*c+3*sum1[rt]*c*c+(r-l+1)*c*c*c\)
注意懶惰陣列下傳的先後順序
#includeusing namespace std;
typedef long long ll;
const int maxx = 1e5+10;
const int mod = 10007;
int t[maxx<<2][4],lazy[maxx<<2][4];
void build(int l,int r,int rt)
void pushdown(int l,int r,int rt)
if(lazy[rt][1]!=1)
if(lazy[rt][2])
}void update(int l,int r,int p,int q,ll c,int op,int rt)
else if(op==1)
else
return;
}int mid=(l+r)/2;
pushdown(mid-l+1,r-mid,rt);
if(p<=mid)update(l,mid,p,q,c,op,rt*2);
if(q>mid)update(mid+1,r,p,q,c,op,rt*2+1);
for(int i=1;i<=3;i++)t[rt][i]=(t[rt*2][i]+t[rt*2+1][i])%mod;
}ll query(int l,int r,int p,int q,int op,int rt)
int main()
}return 0;
}
線段樹懶標記好題 HDU4578
1 1 x y c 代表 把區間 x,y 上的值全部加c 2 2 x y c 代表 把區間 x,y 上的值全部乘以c 3 3 x y c 代表 把區間 x,y 上的值全部賦值為c 4 4 x y p 代表 求區間 x,y 上值的p次方和1 p 3 維護sum1,sum2,sum3分別為一次方 二次方...
HDU 4578 線段樹各種區間操作
原題鏈結 題意 初始乙個長度為n的陣列全為0,有m個操作,輸入op,l,r,x。op 1時,把 l,r 中的所有數加上x op 2時,把 l,r 中的所有樹乘上x op 3時,把 l,r 中的所有數全置為x op 4時,輸出 l,r 中所有數的 x 方的和 思路 令 x a x b 即對乙個x,令他...
HDU 4578 線段樹 三重操作
這道題自己寫了很久,還是沒寫出來,也看了很多題解,感覺多數還是看的迷迷糊糊,最後面看到一篇大佬的才感覺恍然大悟。先說下題意 就是給你n個數,每個數的初始值都是為0 然後給你m個操作 每個操作有 4 個數 op x y c 當 op 1 的時候,把 x到y 範圍內的數 都 加上 c 當 op 2 的時...