Codevs1082 線段樹練習 3

2022-05-16 06:04:15 字數 2306 閱讀 7883

題目描述 description

給你n個數,有兩種操作:

1:給區間[a,b]的所有數增加x

2:詢問區間[a,b]的數的和。

輸入描述 input description

第一行乙個正整數n,接下來n行n個整數,

再接下來乙個正整數q,每行表示操作的個數,

如果第乙個數是1,後接3個正整數,

表示在區間[a,b]內每個數增加x,如果是2,

表示操作2詢問區間[a,b]的和是多少。

pascal選手請不要使用readln讀入

輸出描述 output description

對於每個詢問輸出一行乙個答案

樣例輸入 sample input

1 2 3 2

2 2 3

樣例輸出 sample output

資料範圍及提示 data size & hint

資料範圍

1<=n<=200000

1<=q<=200000

樹狀陣列40分(剩下超時):

1 #include2 #include3 #include4

using

namespace

std;56

intn,m;

7int f[200001];8

9int

read()

1013

while(ch>='

0'&&ch<='9')

14return x*f;15}

1617

int lowbit(int

x)18

2122

void update(int x,int

num)

2329}30

31int sum(int

x)32

39return

sum;40}

4142

intmain()

4357

if(t==2)58

62}63return0;

64 }

線段樹:

1 #include2 #include3 #include4

using

namespace

std;56

struct

node

7tree[600000

];11

12int

n,q;

13int a[200001

];14

15int

read()

1619

while(ch>='

0'&&ch<='9')

20return x*f;21}

2223

void build(int node,int left,int

right)

2431

int mid=(left+right)>>1

;32 build(node<<1

,left,mid);

33 build(node<<1|1,mid+1

,right);

34 tree[node].sum=tree[node<<1].sum+tree[node<<1|1

].sum;35}

3637

void pushdown(int

node)

3846

47void update(int node,int left,int right,int

x)48

56if(tree[node].left==tree[node].right) return;57

if(tree[node].flag>0

) pushdown(node);

58if(right<=mid) update(node<<1

,left,right,x);

59else

if(left>mid) update(node<<1|1

,left,right,x);

60else

6165 tree[node].sum=tree[node<<1].sum+tree[node<<1|1

].sum;66}

6768

long

long query(int node,int left,int

right)

6981

82int

main()

8397

if(t==2)98

101}

102return0;

103 }

codevs 1082 線段樹練習 3

1082 線段樹練習 3 區間修改,區間查詢 時間限制 3 s 空間限制 128000 kb 題目等級 大師 master 給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,接下來n行n個整數...

Codevs 1082 線段樹練習 3

1082 線段樹練習 3 時間限制 3 s 空間限制 128000 kb 題目等級 大師 maste 傳送門題目描述 description 給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,...

codevs 1082 線段樹練習 3

時間限制 3 s 空間限制 128000 kb 題目等級 大師 master 題解給你n個數,有兩種操作 1 給區間 a,b 的所有數增加x 2 詢問區間 a,b 的數的和。輸入描述 input description 第一行乙個正整數n,接下來n行n個整數,再接下來乙個正整數q,每行表示操作的個數...