A Simple Problem with Integers 题目
You have N integers, A1, A2, … , AN. You need to deal with two kinds of operations. One type of operation is to add some given number to each number in a given interval. The other is to ask for the sum of numbers in a given interval.
Input
The first line contains two numbers N and Q. 1 ≤ N,Q ≤ 100000.
The second line contains N numbers, the initial values of A1, A2, … , AN. -1000000000 ≤ Ai ≤ 1000000000.
Each of the next Q lines represents an operation.
“C a b c” means adding c to each of Aa, Aa+1, … , Ab. -10000 ≤ c ≤ 10000.
“Q a b” means querying the sum of Aa, Aa+1, … , Ab.
Output
You need to answer all Q commands in order. One answer in a line.
Sample Input
10 5
1 2 3 4 5 6 7 8 9 10
Q 4 4
Q 1 10
Q 2 4
C 3 6 3
Q 2 4
Sample Output
4
55
9
15
Hint
The sums may exceed the range of 32-bit integers.
裸题
就是线段树有点难debug哈哈,那个pushdown函数里面的
tree[k<<1|1].sum += ((LL)(tree[k<<1|1].r-tree[k<<1|1].l+1))*((LL)lz);
忘记写+1了,交了好几次都不对。。。
有点丑的代码
#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e5 + 1e3;
typedef long long int LL;
LL n , q , num[N];
struct Node{
LL l , r ;
LL lazy , sum;
}tree[N<<2];
void pushup(int k ){
tree[k].sum = tree[k<<1].sum + tree[k<<1|1].sum;
}
void pushdown(int k ){
if(tree[k].lazy){
int lz = tree[k].lazy;tree[k].lazy = 0;
tree[k<<1].sum += ((LL)(tree[k<<1].r-tree[k<<1].l+1))*((LL)lz);
tree[k<<1].lazy += lz;
tree[k<<1|1].sum += ((LL)(tree[k<<1|1].r-tree[k<<1|1].l+1))*((LL)lz);
tree[k<<1|1].lazy += lz;
}
}
void build(int k , int l , int r){
tree[k].l = l;
tree[k].r = r;
tree[k].lazy = 0;
if(l == r){
tree[k].sum = num[l];
return ;
}
int mid = (l+r)>>1;
build(k<<1 , l , mid);
build(k<<1|1 , mid+1 , r);
pushup(k);
}
void change(int k , int l , int r , int tonum){
if(tree[k].r < l) return ;
if(tree[k].l > r) return ;
if(tree[k].l>=l&&tree[k].r<=r){
tree[k].sum += (tree[k].r-tree[k].l+1)*tonum;
tree[k].lazy += tonum;
return ;
}
pushdown(k);
change(k<<1 , l , r , tonum);
change(k<<1|1 , l , r , tonum);
pushup(k);
}
LL query(int k , int l , int r){
if(tree[k].l>r) return 0;
if(tree[k].r<l) return 0;
if(tree[k].l>=l&&tree[k].r<=r) return tree[k].sum;
pushdown(k);
return (query(k<<1 , l , r ) + query(k<<1|1 , l , r));
}
int main(){
ios::sync_with_stdio(false);
int i , j , a , b , c ;
char ope;
cin>>n>>q;
for(i = 1 ; i <= n ; i ++ ) cin>>num[i];
build(1,1,n);
for(i = 1 ; i <= q ; i ++ ){
cin>>ope;
if(ope == 'C'){
cin>>a>>b>>c;
change(1,a,b,c);
}else{
cin>>a>>b;
cout<<query(1,a,b)<<endl;
}
}
return 0;
}
//A Simple Problem with Integers(线段树)