題目描述 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 #include4using
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 #include4using
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,每行表示操作的個數...