题目地址: 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不会有改变.

#include <iostream>
#include <cstring>
using namespace std; #define MAX_INDEX_RANGE 32010 // index is from 1. // 原始数据数组是隐藏的, a[i] 表示x坐标为i的星星数目.
// s 为维护a数组的树状数组.下标从1 开始.
int s[MAX_INDEX_RANGE];
// level[i] 表示level为i的星星的数目.
int level[MAX_INDEX_RANGE]; int lowbit(int x){
return x & (-x);
} // 计算x坐标不超过x的星星的总数. 由于是树状数组是动态构建的, 按照输入顺序, y值大于当前星星的还没有被输入, 所以这个数目就是位于当前星星左下方的数目.
int sumn(int x){
int sum = ;
while(x > ){
sum += s[x];
x -= lowbit(x);
}
return sum;
} //N: 总的星星的实际数目.
void modify(int n,int delta,int N){
// 注意: s[i]的范围是星星坐标的最大值, 因为原始数据数组a表示的是x坐标.
while(n <= MAX_INDEX_RANGE){
s[n] += delta;
n += lowbit(n);
}
} int main(){
int N,x,y,i;
while(cin>>N){
memset(s,,sizeof(s));
memset(level,,sizeof(level));
for(i=;i<N;++i){
cin>>x>>y;
x++; // 因为树状数组坐标从1开始.
level[sumn(x)]++;
modify(x,,N);
}
for(i=;i<N;++i){
cout<<level[i]<<endl;
}
}
return ;
}

总结:

  - 题目中关键在于找出一维数组a[i]来记录x坐标为 i 的星星的数目. 根据分析, 要求出某个星星左下方的星星数目, 只需求出当前(在它坐标输入的时候)x坐标小于它的星星的数目即可, 也就是要随时查询 x坐标小于等于它的x坐标的星星数目的和. 正好可以用树状数组的统计功能对当前的a[]进行统计.

  - 树状数组 s 作为一种数据结构比较抽象,没有实际的意义, 仅仅是方便对原始数据数组进行统计和维护.

  - 树状数组可以用作原始数据数组, 因为s[i]一定包含a[i], 要求a[i] 只需通过计算即可算出来 sumn(i) - sumn(i-1).


-->

树状数组 - 2352 Stars的更多相关文章

  1. 【POJ2352】【树状数组】Stars

    Description Astronomers often examine star maps where stars are represented by points on a plane and ...

  2. 树状数组 poj2352 Stars

    2019-05-20 22:52:07 加油,坚持,加油,坚持 !!! #include<iostream> #include<cstdio> #include<cstr ...

  3. POJ 2352 Stars(树状数组)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 30496   Accepted: 13316 Descripti ...

  4. hdu 1541/poj 2352:Stars(树状数组,经典题)

    Stars Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submi ...

  5. POJ 2352 &amp;&amp; HDU 1541 Stars (树状数组)

    一開始想,总感觉是DP,但是最后什么都没想到.还暴力的交了一发. 然后開始写线段树,结果超时.感觉自己线段树的写法有问题.改天再写.先把树状数组的写法贴出来吧. ~~~~~~~~~~~~~~~~~~~ ...

  6. 【树状数组】POJ 2352 Stars

    /** * @author johnsondu * @time 2015-8-22 * @type Binary Index Tree * ignore the coordinate of y and ...

  7. POJ 2352 Stars(树状数组)题解

    Language:Default Stars Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 52268 Accepted: 22 ...

  8. POJ 2352 stars (树状数组入门经典!!!)

    Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 54352   Accepted: 23386 Descripti ...

  9. 树状数组 || POJ 2352 Stars

    Astronomers often examine star maps where stars are represented by points on a plane and each star h ...

随机推荐

  1. ActiveMQ入门之四--ActiveMQ持久化方式

    消息持久性对于可靠消息传递来说应该是一种比较好的方法,有了消息持久化,即使发送者和接受者不是同时在线或者消息中心在发送者发送消息后宕机了,在消息中心重新启动后仍然可以将消息发送出去,如果把这种持久化和 ...

  2. Linux命令之hostname - 显示或设置主机名

    我使用过的Linux命令之hostname - 显示或设置主机名 本文链接:http://codingstandards.iteye.com/blog/804648   (转载请注明出处) 用途说明 ...

  3. kotlin学习三:初步认识kotlin(第二篇)

    上一章熟悉了kotlin基本的变量和函数声明,并明白了如何调用函数.本章再来看一些其他有用的东西 包括: 1. kotlin代码组织结构 2. when语法 3. 循环迭代语法 4. try表达式 1 ...

  4. Code blocks调试教程

    特别声明:本教程已转移至百度经验:https://jingyan.baidu.com/article/6b182309939a87ba58e159bf.html 一.题外话 之前一直想用Code bl ...

  5. ThinkPHP实例—实现登录验证

    ThinkPHP 验证 本篇我们将运用商城实例讲解一下如何运用ThinkPHP做一个登录验证 我们的框架目录结构如下图所示: 其中 app  文件夹就是我们的应用文件夹  它的目录结构如下所示 其中 ...

  6. 使用CXF发布和调用webservice之HelloWorld入门

    依赖的JAR     cxf-2.2.10.jar     jetty-6.1.21.jar     jetty-util-6.1.21.jar     servlet-2_5-api.jar     ...

  7. leetcode445

    /** * Definition for singly-linked list. * public class ListNode { * public int val; * public ListNo ...

  8. struts.xml配置文件(package,namespace,action)

    struts2.0 xml配置 struts.xml文件结构 struts.xml文件是整个Struts2框架的核心. struts.xml文件内定义了Struts2的系列Action,定义Actio ...

  9. 转载--js对象无法当成参数传递

    今天我碰到了这个问题一头雾水,明明记得对象是可以传参的啊.我使用了一款基于bootstrap的表格插件DataTables,想把行信息直接传给操作函数,方便编辑(此行信息是一个对象,按道理可以的啊), ...

  10. java算法 第七届 蓝桥杯B组(题+答案) 5.抽签

    5.抽签  (代码填空) X星球要派出一个5人组成的观察团前往W星.其中:A国最多可以派出4人.B国最多可以派出2人.C国最多可以派出2人..... 那么最终派往W星的观察团会有多少种国别的不同组合呢 ...