hdu4578 (多標記線段樹)

2022-03-06 21:54:40 字數 1106 閱讀 8252

對於乙個區間有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 的時...