码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组 - 2352 Stars

时间:2015-10-11 14:06:56      阅读:178      评论:0      收藏:0      [点我收藏+]

标签:

题目地址: http://poj.org/problem?id=2352

分析:

  - 题意分析:  有n个星星, 它的左下方(x和y不超过它)的星星的数目就是它的level, 分别计算level 为 0 到 n-1 的星星的数目. 输入是先按照 y 从小到大排序, 如果y相同,就按照x递增排序, 不会有2个以上星星占同一个坐标.

  - 数据结构

    - 用原始数据数组 a 表示同一个x坐标的星星数目. (a[i]为x坐标为 i-1的星星数目).  注意输入数据时排序的.

    - 树状数组s维护a的信息. 

    - level: level[i] 记录 level为i的星星的数目.

  - 计算

    - 树状数组构建: 由于输入是先按照y排序, 再按照x排序的, 所以不用数组a来构建(最开始a为全0, s也为全0), 而是直接根据输入从无到有更新.

    - 计算level: sumn(int x) 计算了x坐标不大于x的星星的个数, 而按照输入, 计算的时候y值大于当前星星的星星还没有被输入. 所以这个数目就是当前星星的level, 而后面输入的y值不会比这个小, 所以后面的输入, 对当前星星的level不会有改变.

 1 #include <iostream> 
 2 #include <cstring>
 3 using namespace std;  
 4   
 5 #define MAX_INDEX_RANGE 32010 // index is from 1.
 6 
 7 // 原始数据数组是隐藏的, a[i] 表示x坐标为i的星星数目.
 8 // s[1 : N] 树状数组,表示第1到N颗star的.下标从1 开始. 
 9 int s[MAX_INDEX_RANGE];
10 // level[i] 表示level为i的星星的数目.
11 int level[MAX_INDEX_RANGE];
12 
13 int lowbit(int x){
14     return x & (-x);
15 }
16 
17 // 计算x坐标不超过x的星星的总数. 由于是树状数组是动态构建的, 按照输入顺序, y值大于当前星星的还没有被输入, 所以这个数目就是位于当前星星左下方的数目.
18 int sumn(int x){
19     int sum = 0;
20     while(x > 0){
21         sum += s[x];
22         x -= lowbit(x);
23     }
24     return sum;
25 }
26 
27 //N: 总的星星的实际数目.
28 void modify(int n,int delta,int N){
29     // 注意: s[i]的范围是星星坐标的最大值, 因为原始数据数组a表示的是x坐标.
30     while(n <= MAX_INDEX_RANGE){ 
31         s[n] += delta;
32         n += lowbit(n);
33     }
34 }
35 
36 int main(){
37     int N,x,y,i;
38     while(cin>>N){
39         memset(s,0,sizeof(s));
40         memset(level,0,sizeof(level));
41         for(i=0;i<N;++i){
42             cin>>x>>y;
43             x++; // 因为树状数组坐标从1开始.
44             level[sumn(x)]++;
45             modify(x,1,N);
46         }
47         for(i=0;i<N;++i){
48             cout<<level[i]<<endl;
49         }
50     }
51     return 0;  
52 }  

 

树状数组 - 2352 Stars

标签:

原文地址:http://www.cnblogs.com/roger9567/p/4868986.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!