题意:
给出 n 个数..
用a, b表示 n 次更新一段区间[a, b]..
求更新完 n 次后这 n 个数的值..
思路:
正常做法是 从 a 到 b 每个数+1
不正常做法是 用树状数组 在a的地方+1 在b的地方-1 然后求某个数 k 的值的时候就求从1~k的和..
Tips:
树状数组的应用..
Code:
View Code
1 #include <iostream> 2 #include <cstring> 3 #include <stdio.h> 4 using namespace std; 5 6 int n; // n是边界 7 int c[100001]; // 标记数组 8 int lowbit(int x) 9 { 10 //返回x最右边的1 11 return (x)&(-x); 12 } 13 void modify(int pos,int x)//pos位置修改x值 14 { 15 while(pos<=n) 16 { 17 c[pos]+=x; 18 pos+=lowbit(pos); 19 } 20 } 21 int getSum(int x)//返回1到区间的和 22 { 23 int sum=0; 24 while(x>0) 25 { 26 sum+=c[x]; 27 x-=lowbit(x); 28 } 29 return sum; 30 } 31 int main() 32 { 33 int i, j, k; 34 int a, b; 35 while(scanf("%d", &n) != EOF) 36 { 37 if(n == 0) break; 38 memset(c, 0, sizeof(c)); 39 40 for(i = 1; i <= n; ++i) { 41 scanf("%d %d", &a, &b); 42 modify(a, 1); 43 modify(b+1, -1); 44 } 45 for(i = 1; i <= n; ++i) { 46 printf("%d%c", getSum(i), i == n?'\n':' '); 47 } 48 } 49 return 0; 50 }