POJ - 2352 Stars解题报告(树状数组求二维区域和)

原创 2017年04月24日 11:33:04

题目大意:

给你一个二维的坐标系(32000*32000),里面有n(15000)个点,告诉你每个点的坐标(各个点各不相同)。定义:(x0,y0)的左下角区域为:{(x,y)|0<=x<=x0&&0<=y<=y0};让你输出左下角区域有分别有0个点,1个点。。。n-1个点的点的个数。
注:坐标点以y轴坐标的升序给出,y坐标相同的点以x轴坐标的升序给出。

分析:

这个题一开始想要用二维树状数组来做,但是觉得太麻烦了,去网上看了一下别人的思路,发现了一个很巧妙的地方。因为输入的时候是按照一定的升序顺序输入的,也就是一行一行输入,那么,其实,这些星星在一行上也是一样的(假设这些星星可以重合)。也就是说,在y=0的时候,输入一个点的坐标,那这个星星的左面有多少个点是已经算出来了的,用树状数组只需要log32000的时间。然后就是关键了,到了输入y=1行的点的坐标的时候,直接还是把它记录到y=0的那一行上面去,然后再用树状数组来求出该点的level值,时间复杂度还是log32000。综合时间复杂度为15000*log32000;

代码:

#include<iostream>
#include<stdio.h>
#include<string.h>

using namespace std;

int tree[40000]={0};
int num[40000]={0};
int n;

int lowbit(int x)
{
    return (-x)&x;
}

void add(int x,int t)
{
    while(x<=32010)
    {
        tree[x]+=t;
        x=x+lowbit(x);
    }
}

int sum(int x)
{
    int s=0;
    while(x>0)
    {
        s+=tree[x];
        x=x-lowbit(x);
    }
    return s;
}

int main()
{
    while(cin>>n)
    {
        memset(tree,0,sizeof(tree));
        memset(num,0,sizeof(num));
        for(int i=1;i<=n;i++)
        {
            int x,y;
            scanf("%d%d",&x,&y);
            x++;
            num[sum(x)]++;
            //cout<<sum(x)<<endl;
            add(x,1);
        }
        for(int i=0;i<n;i++)
        {
            cout<<num[i]<<endl;
        }
    }
}

后注:

注意坐标范围是[0,32000],但是树状数组里不能有0,所以把x整体加1。

版权声明:本文为博主原创文章,未经博主允许也可以转载哦~

HDU 4747 Mex (线段树)

转载请注明出处,谢谢http://blog.csdn.net/ACM_cxlove?viewmode=contents    by---cxlove 题目:给出一个序列,mex{}表示集合中没有出现...
  • ACM_cxlove
  • ACM_cxlove
  • 2013年09月16日 22:52
  • 5752

[树状数组] 区间求和的三种模型

树状数组在区间求和问题上有很高的效率,尤其在非常困难的比赛中(数据量大,对时间限制很严格的比赛)能发挥非常大的作用,其各种复杂度都要比线段树低很多,而且其代码简洁优美……有关区间求和,主要有以下三个模...
  • u012848631
  • u012848631
  • 2015年07月22日 22:06
  • 1607

POJ 2155 Matrix(二维树状数组,绝对详细)

Matrix Time Limit: 3000MS   Memory Limit: 65536K Total Submissions: 20599   Accept...
  • acm_BaiHuzi
  • acm_BaiHuzi
  • 2015年07月09日 16:49
  • 2689

POJ 2352 stars【树状数组】解题报告

关于树状数组,请点这里:http://blog.csdn.net/huang8579/article/details/8770743 题目大意: 给你星星的坐标(y递增,若y相等,x递增)...
  • huang8579
  • huang8579
  • 2013年04月12日 13:44
  • 879

线段树(询问、插入)&树状数组POJ2352Starts解题报告

线段树 询问、插入POJ2352Starts
  • Dafang_Xu
  • Dafang_Xu
  • 2015年09月01日 23:16
  • 386

POJ 2352 Stars 解题思路,树状数组

题目传送门    http://poj.org/problem?id=2352 Stars Time Limit: 1000MS  Memory Limit: 65536K Total Submi...
  • caojiangxia
  • caojiangxia
  • 2015年04月28日 09:12
  • 304

树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告

树状数组 离散化 求逆序数POJ 2299Ultra-QuickSort解题报告
  • Dafang_Xu
  • Dafang_Xu
  • 2015年09月02日 21:20
  • 473

POJ2352 Stars 【树状数组】or【线段树】

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31172   Accepte...
  • u012846486
  • u012846486
  • 2014年07月13日 11:41
  • 945

POJ 2352——Stars(树状数组)

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32738   Accepte...
  • u014141559
  • u014141559
  • 2014年08月25日 20:47
  • 324

POJ 2352 Stars 树状数组(入门)

/** * 树状数组(入门): * 3次TLE,一直弄不懂原因,还是看discuss,因为依题X取值是[0, 32000] 可能取0 * 所以当x等于0的时候,lowbit(0) ...
  • xuruoxin
  • xuruoxin
  • 2013年07月25日 23:13
  • 475
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ - 2352 Stars解题报告(树状数组求二维区域和)
举报原因:
原因补充:

(最多只允许输入30个字)