zoukankan      html  css  js  c++  java
  • HDU1556 【树状数组】(改段求点)

    #include<cstdio>
    #include<algorithm>
    #include<cstring>
    #define maxn 100050
    using namespace std;
    
    int b[maxn];
    int n;
    int lowbit(int x)
    {
        return x&(-x);
    }
    
    void ADD(int x, int c)    //向下查询
    {
        for (int i=x; i>0; i-=i&(-i)) 
        b[i] += c;
    }
    int SUM(int x)     //向上统计
    {
        int s = 0;
        for (int i=x; i<=n; i+=i&(-i)) 
        s += b[i];
        return s;
    }
    
    int main()
    {
        while(scanf("%d",&n)&&n)
        {
            int x,y;
            memset(b,0,sizeof b);
            for(int i=0; i<n; i++)
            {
                scanf("%d%d",&x,&y);
                ADD(y,1);
                ADD(x-1,-1);
            }
            for(int i=1; i<n; i++)
            {
                printf("%d ",SUM(i));
            }
            printf("%d
    ",SUM(n));
        }
        return 0;
    }

    心得体会

    树状数组主要就分为3种类型。针对这3种类型,我已经转载了一篇文章,里面有3种类型的模板。

    做题的时候,只要分清楚是考查哪种类型,然后套模板就可以了。

    针对这道题,还有几点要注意的地方。

    (1) 不要忘了对数组b进行初始化。

    (2)输入   while(scanf("%d",&n)&&n)   的运用,既完成了输入,同时判断了n 是否为0.

    (3)输出中的小细节。

           前n个数之间存在空格,最后一个数后面不输出空格,直接换行。

           注意细节~~~~~

  • 相关阅读:
    eclipse使用
    模板模式

    异常处理
    内部类
    面向对象三大特征(三)--多态
    java双指针的简单理解
    简单易懂回溯算法
    《深入理解Java虚拟机》之(一、内存区域)
    Java笔记(第七篇 JDBC操作数据库)
  • 原文地址:https://www.cnblogs.com/fightfor/p/3899621.html
Copyright © 2011-2022 走看看