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。

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

相关文章推荐

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

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

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

线段树 询问、插入POJ2352Starts

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

题目传送门    http://poj.org/problem?id=2352 Stars Time Limit: 1000MS  Memory Limit: 65536K Total Submi...

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

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

poj 2352 Stars(树状数组)

StarsDescriptionAstronomers often examine star maps where stars are represented by points on a plane...

POJ - 2352 - Stars (树状数组!!)

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 34244   Accepte...

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

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 31172   Accepte...

POJ-2352-Stars-树状数组

树状数组中,每个结点管辖了不同的原数组元素的和。 令A[1...n]表示原数组,C[1...n]表示树状树组。 观察图,可知: C1 = A1 C2 = A1 + A2 C3 = A...
  • lihao21
  • lihao21
  • 2011年03月28日 22:39
  • 881

POJ 2352 Stars(简单树状数组)

什么是树状数组在这里就不说了啊,这里有解释了啊。http://blog.csdn.net/fulongxu/article/details/19701281 就是一个模版题目,直接套模版都可以过。先建...

POJ 2352 Stars (线段树&&树状数组)

Stars Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 32475   Accepte...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:POJ - 2352 Stars解题报告(树状数组求二维区域和)
举报原因:
原因补充:

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