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 }

 

 

你可能感兴趣的:(HDU)