A Simple Problem with Integers POJ - 3468 (区间修改+区间查询)
Posted shallow-dream
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了A Simple Problem with Integers POJ - 3468 (区间修改+区间查询)相关的知识,希望对你有一定的参考价值。
A Simple Problem with Integers POJ - 3468
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
1 #include <iostream> 2 #include <algorithm> 3 #include <cstring> 4 #include <string> 5 #include <vector> 6 #include <map> 7 #include <set> 8 #include <list> 9 #include <deque> 10 #include <queue> 11 #include <stack> 12 #include <cstdlib> 13 #include <cstdio> 14 #include <cmath> 15 #include <iomanip> 16 #define ull unsigned long long 17 #define ll long long 18 #define pb push_back 19 #define mem(sum,x) memset(sum,x,sizeof(sum)) 20 #define rep(i,start,end) for(int i=start;i<=end;i++) 21 #define per(i,end,start) for(int i=end;i>=start;i--) 22 #define tle ios::sync_with_stdio(false); cin.tie(0); cout.tie(0); 23 using namespace std; 24 const int mod = 998244353; 25 const int mxn = 2e5 +7; 26 int _,n,m,k,t,u,v,w,ans,cnt,ok; 27 int num[mxn] , last[mxn] , key[mxn] ; 28 /// string str ; 29 char str[10] , ch ; 30 #define lc now<<1 31 #define rc now<<1|1 32 struct node {ll val , l , r , sum , lazy ;};node no[mxn<<4]; 33 int lowbit(int x) {return x&-x;}; 34 /// void add(int i,int val){while(i<=n*4) key[i]+=val , i+=lowbit(i) ;} 35 /// int ask(int x){int ans = 0 ;while(x>0) ans+=key[x] , x-=lowbit(x) ;return ans;} 36 void pushup(int now){ 37 no[now].val = no[lc].val + no[rc].val ; 38 } 39 void updown(int now) 40 { 41 /// no[now].val = no[lc].val + no[rc].val; 42 /// no[now].val = max( no[lc].val , no[rc].val ); 43 if(no[now].lazy) 44 { 45 no[lc].lazy += no[now].lazy; 46 no[rc].lazy += no[now].lazy; 47 no[lc].val += (no[lc].r-no[lc].l+1)*no[now].lazy; 48 no[rc].val += (no[rc].r-no[rc].l+1)*no[now].lazy; 49 no[now].lazy = 0; 50 } 51 } 52 void build(int l,int r,int now) 53 { 54 no[now].l = l, no[now].r = r ,no[now].lazy = 0 ,no[now].val = 0 ; 55 if(l==r){ 56 cin>>no[now].val;return ; 57 } 58 int mid = (l+r)>>1; 59 build(l,mid,lc); build(mid+1,r,rc); pushup(now) ; 60 } 61 ll ask(int l,int r,int now) 62 { 63 if(l<=no[now].l && r>=no[now].r){ 64 return no[now].val; 65 } 66 updown(now); 67 int mid = (no[now].l+no[now].r)>>1; 68 ll ans = 0 ; 69 if(l<=mid) ans+=ask(l,r,lc); 70 if(r>mid) ans+=ask(l,r,rc); 71 return ans ; 72 } 73 void add(int l,int r,int val,int now) 74 { 75 if(l<=no[now].l && no[now].r<=r){ 76 no[now].lazy += val ; 77 no[now].val += (no[now].r-no[now].l+1)*val; 78 return ; 79 } 80 updown(now); 81 int mid = (no[now].l+no[now].r)>>1; 82 if(l<=mid) add(l,r,val,lc); 83 if(r>mid) add(l,r,val,rc); 84 pushup(now); 85 } 86 int main() 87 { 88 tle; 89 while(cin>>n>>m) 90 { 91 build(1,n,1); 92 while(m--) 93 { 94 int u,v; 95 cin>>ch>>u>>v; 96 if(ch==‘Q‘) cout<<ask(u,v,1)<<endl; 97 else { 98 cin>>k; add(u,v,k,1); 99 } 100 } 101 } 102 }
以上是关于A Simple Problem with Integers POJ - 3468 (区间修改+区间查询)的主要内容,如果未能解决你的问题,请参考以下文章
POJ3468A Simple Problem with Integers
线段树专题 POJ3468 A Simple Problem with Integers
A Simple Problem with Integers
A Simple Problem with Integers