zoukankan      html  css  js  c++  java
  • 数据结构:树状数组

      关于树状数组的概述,可以看一下这篇博客:http://blog.csdn.net/int64ago/article/details/7429868

      树状数组是一个可以高效地进行区间统计的数据结构,在思想上类似于线段树,比线段树节省空间,编程复杂度比线段树低,但适用范围比线段树小。主要工作也是查询和更新。

      例题:POJ - 2352    (http://poj.org/problem?id=2352

      题目大意:输入n个星星坐标,坐标按y递增顺序输入,y相同按x递增顺序输入。定义一个星星的级别是横纵坐标都不超过自己的星星个数(不包括自己),问级别为0~n-1的星星分别有多少个。

      题目思路:我们可以发现,当前输入这个星星,跟后面的星星没有关系,因为后面输入的星星横纵坐标肯定会有超过当前星星的。所以只要把当前输入的x之前的横坐标加起来就可以了。树状数组非常非常的符合这个特性。要注意的一点是树状数组下标从1开始算,所以把题目输入的横坐标全部右移了一位。

      代码:  http://paste.ubuntu.com/16317880/

     1 #include <iostream>
     2 using namespace std;
     3 int tree[32001],level[32001];
     4 int lowbit(int x){return x&(-x);}
     5 int read(int k)        
     6 {
     7     int sum=0;
     8     while(k)
     9     {
    10         sum += tree[k];
    11         k -= lowbit(k);
    12     }
    13     return sum;
    14 }
    15 void add(int k)
    16 {
    17     while(k<=32001)
    18     {
    19         tree[k]++;
    20         k += lowbit(k);
    21     }
    22 }
    23 int main()
    24 {
    25     int n,i,x,y;
    26     cin>>n;
    27     for(i=0;i<n;i++)
    28     {
    29         cin>>x>>y;
    30         level[read(x+1)]++;        //全部x右移一位
    31         add(x+1);
    32     }
    33     for(i=0;i<n;i++)
    34         cout<<level[i]<<endl;
    35 }
  • 相关阅读:
    jQuery插件主要有两种扩展方式
    系统负载测试工具-LoadRunner
    安全扫描工具-AppScan
    newinstance()和new有什么区别?(转)
    类的加载、连接和初始化 (转)
    tar 基础
    了解【重放攻击】
    DDLDMLDCLDQL
    web.xml的配置问题
    组合与聚合
  • 原文地址:https://www.cnblogs.com/GodA/p/5475486.html
Copyright © 2011-2022 走看看