資料結構 線段樹 牛客練習賽28B

2021-08-28 17:53:59 字數 1718 閱讀 8664

op = 1 sum

op = 2 sum2 平方和

op = 3 *mul

op = 4 +add

2個lazy標記

#include #include using namespace std;

#define lc (rt << 1)

#define rc (rt << 1 | 1)

#define mid (l + r) / 2

typedef long long ll;

const int maxn = 1e4 + 5;

ll a[maxn];

ll sum[maxn << 2],sum2[maxn << 2];

ll _sum,_sum2;

ll mul[maxn << 2];

ll add[maxn << 2];

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

init(l,mid,lc);

init(mid + 1,r,rc);

sum[rt] = sum[lc] + sum[rc];

sum2[rt] = sum2[lc] + sum2[rc];

mul[rt] = 1;

add[rt] = 0;

}//一定要先更新sum2,因為它用到了舊的sum

//如果2個標記分開處理,先確定順序,第乙個標記除了update中操作,還更新d第二個標記;第二個標記就是update操作

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

if(add[rt] != 0)

}//左子樹原x1*a+y1 將父節點傳遞->x*(x1*a+y1)+y

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

//void query(int ql,int qr,int l,int r,int rt)

pushdown(l,r,rt);

if(ql <= mid) query(ql,qr,l,mid,lc);

if(mid < qr) query(ql,qr,mid + 1,r,rc);

}void update1(int ql,int qr,int l,int r,int rt,ll x)

pushdown(l,r,rt);

if(ql <= mid) update1(ql,qr,l,mid,lc,x );

if(mid < qr) update1(ql,qr,mid + 1,r,rc,x );

sum[rt] = sum[lc] + sum[rc];

sum2[rt] = sum2[lc] + sum2[rc];

}void update2(int ql,int qr,int l,int r,int rt,ll x)

pushdown(l,r,rt);

if(ql <= mid) update2(ql,qr,l,mid,lc,x );

if(mid < qr) update2(ql,qr,mid + 1,r,rc,x );

sum[rt] = sum[lc] + sum[rc];

sum2[rt] = sum2[lc] + sum2[rc];

}int main()

else if(op == 2)

else if(op == 3)

else if(op == 4)

}return 0;

}

牛客練習賽28 B 資料結構

題目描述 qn姐姐最好了 qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x 第一行兩個數n,m ...

牛客練習賽28 B 複習線段樹 )

description qn姐姐給你了乙個長度為n的序列還有m次操作讓你玩,1 l r 詢問區間 l,r 內的元素和 2 l r 詢問區間 l,r 內的元素的平方和 3 l r x 將區間 l,r 內的每乙個元素都乘上x 4 l r x 將區間 l,r 內的每乙個元素都加上x input n,mop...

《牛客練習賽28 B》

這題主要就是多了乙個平方和的操作。我們維護平方和的值的時候。需要注意在下放的時候,要先把乘法之後的sum1算出來,這對算sum1最終的值沒有影響。但是對sum2的值有影響。因為我們在計算中就在更新adtag的值,所以這個adtag它的sum1應該最終化。includeusing namespace ...