• 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 }

     

  • 相关阅读:
    图床_shell命令grep/egrep
    图床_shell命令vi/vim
    图床_shell命令tr
    图床_shell命令wc
    图床_shell命令vimdiff
    图床_shell命令diff
    图床_shell命令rev
    图床_shell命令cut
    图床_shell命令tail
    图床_shell命令head
  • 原文地址:https://www.cnblogs.com/Griselda/p/2686074.html
Copyright © 2020-2023  润新知