Hdu 1556 成段更新.cpp

题意:

给出 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 }

 

原文地址:https://www.cnblogs.com/Griselda/p/2686074.html