标签:
Description
给出了一个序列,你需要处理如下两种询问。
"C a b c"表示给[a, b]区间中的值全部增加c (-10000 ≤ c ≤ 10000)。
"Q a b" 询问[a, b]区间中所有值的和。
Input
第一行包含两个整数N, Q。1 ≤ N,Q ≤ 100000.
第二行包含n个整数,表示初始的序列A (-1000000000 ≤ Ai ≤ 1000000000)。
接下来Q行询问,格式如题目描述。
Output
对于每一个Q开头的询问,你需要输出相应的答案,每个答案一行。
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
//自己写,又超时了,网上看了别人的才过的,在类里面要增加一个积累量这个数据,这样,增加命令的时候只要将特定区间积累量加起来并且num+总和,不必遍历到每一个叶节点,但是在查询时,还是要释放,因为,可能查的区间,在积累的这个区间只占一部分。
这样节约了时间,你能知道在哪部分节约了吗
1 #include <stdio.h> 2 #include <string.h> 3 4 struct 5 { 6 int l; 7 int r; 8 double num; 9 double Inc; 10 }shu[400000]; 11 12 void Init (int left,int right,int k) 13 { 14 shu[k].l=left; 15 shu[k].r=right; 16 shu[k].Inc=0; 17 if(left==right) 18 { 19 scanf("%lf",&shu[k].num); 20 return; 21 } 22 int mid=(left+right)/2; 23 Init(left,mid,2*k); 24 Init(mid+1,right,2*k+1); 25 shu[k].num=shu[2*k].num+shu[2*k+1].num; 26 } 27 28 void insert(int left,int right,double c,int k) 29 { 30 if (shu[k].l==left&&shu[k].r==right)//到某个区间 31 { 32 shu[k].Inc+=c; 33 return; 34 } 35 shu[k].num+=(right-left+1)*c; 36 int mid=(shu[k].l+shu[k].r)/2; 37 if (right<=mid) 38 insert(left,right,c,2*k); 39 else if (left>mid) 40 insert (left,right,c,2*k+1); 41 else 42 { 43 insert(left,mid,c,2*k); 44 insert(mid+1,right,c,2*k+1); 45 } 46 } 47 48 double query(int left,int right,int k) 49 { 50 if (shu[k].l==left&&shu[k].r==right)// 51 { 52 53 return shu[k].num+(shu[k].r-shu[k].l+1)*shu[k].Inc; 54 } 55 int mid=(shu[k].l+shu[k].r)/2; 56 if(shu[k].Inc!=0)//将这个区间的积累量释放 57 { 58 shu[k].num+=(shu[k].r-shu[k].l+1)*shu[k].Inc;//自己先加上 59 insert(shu[k].l,mid,shu[k].Inc,2*k); 60 insert(mid+1,shu[k].r,shu[k].Inc,2*k+1); 61 shu[k].Inc=0; 62 } 63 if (left>mid) return query(left,right,2*k+1); 64 else if (right<=mid) return query(left,right,2*k); 65 else 66 return query(left,mid,2*k)+query(mid+1,right,2*k+1); 67 68 } 69 70 int main() 71 { 72 int Q; 73 int all_p,a,b; 74 double c; 75 char comend; 76 while (scanf("%d%d",&all_p,&Q)!=EOF) 77 { 78 Init(1,all_p,1); 79 while (Q--) 80 { 81 getchar(); 82 scanf("%c",&comend); 83 scanf("%d%d",&a,&b); 84 85 if (comend==‘Q‘) printf("%.0lf\n",query(a,b,1)); 86 if (comend==‘C‘) 87 { 88 scanf("%lf",&c); 89 insert(a,b,c,1); 90 } 91 } 92 } 93 return 0; 94 }
F - A Simple Problem with Integers
标签:
原文地址:http://www.cnblogs.com/haoabcd2010/p/5692339.html