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

2021-08-28 17:48:43 字數 1916 閱讀 3809

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

接下來一行n個數表示初始序列

就下來m行每行第乙個數為操作方法opt,

若opt=1或者opt=2,則之後跟著兩個數為l,r

若opt=3或者opt=4,則之後跟著三個數為l,r,x

操作意思為題目描述裡說的

對於每乙個操作1,2,輸出一行表示答案
示例1

複製

5 6

1 2 3 4 5

1 1 5

2 1 5

3 1 2 1

4 1 3 2

1 1 4

2 2 3

複製

15

5516

41

線段樹懶惰標記:

#include#include#includeusing namespace std;

#define ll long long

const int maxm = 10005;

int a[maxm];

struct node

tr[maxm * 20];

void down(int num)

tr[num].add = 0;

} if (mdd > 1)

tr[num].mdd = 1; }}

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

int mid = (l + r) / 2;

build(l, mid, num * 2);

build(mid + 1, r, num * 2 + 1);

tr[num].val = tr[num * 2].val + tr[num * 2 + 1].val;

tr[num].s2 = tr[num * 2].s2 + tr[num * 2 + 1].s2;

}void update(int l, int r, ll val, int num, int flag)

int mid = (tr[num].l + tr[num].r) / 2;

if (mid >= r) update(l, r, val, num * 2, flag);

else if (mid < l) update(l, r, val, num * 2 + 1, flag);

else

down(num * 2), down(num * 2 + 1);

tr[num].val = tr[num * 2].val + tr[num * 2 + 1].val;

tr[num].s2 = tr[num * 2].s2 + tr[num * 2 + 1].s2;

}ll query(int l, int r, int num, int flag)

int mid = (tr[num].l + tr[num].r) / 2;

ll ans = 0;

if (mid >= r)

ans += query(l, r, num * 2, flag);

else if (mid < l)

ans += query(l, r, num * 2 + 1, flag);

else

return ans;

}int main()

} return 0;

}

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

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 接下來一行...

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

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 lo...

牛客練習賽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 ...