您的位置:首页 > 其它

POJ2352 Stars

2014-07-26 11:07 330 查看
POJ2352 [b]Stars

[/b]

题目大意:

在坐标上有n个星星,如果某个星星坐标为(x, y), 它的左下位置为:(x0,y0),x0<=x 且y0<=y。如果左下位置有a个星星,就表示这个星星属于level x

按照y递增,如果y相同则x递增的顺序给出n个星星,求出所有level水平的数量。

一维的树状数组,第一次学习树状数组的简单题。

代码如下:

#include<iostream>

#include<algorithm>

#include <queue>

#include<stack>

#include<map>

#include<string>

#include<set>

#include<vector>

#include<string.h>

#include<math.h>

#include<stdio.h>

#include<stdlib.h>

using namespace std;

#define INF 2000000002

#define pow(a,b,c,d) (a-c)*(a-c)+(b-d)*(b-d)

#define swap(a,b) (a^=b,b^=a,a^=b)

#define sca(a) scanf("%d",&a)

#define mem(a) memset(a,0,sizeof(a))

#define ok1 printf("ok1\n");

#define ok2 printf("ok2\n");

#define orz printf("orz...\n");

#define eps 1e-8

#define PI acos(-1.0)

#define N 15000*3

int c
;

int level
;

int lowbit(int x){return x&(-x);} //返回2^x

int sum(int x)

{

int sm=0;

while(x>0)

{

sm+=c[x];

x-=lowbit(x);

}

return sm;

} //求和

void add(int x)

{

while(x<N)

{

c[x]++;

x+=lowbit(x);

}

} //修改

void update(int x,int num) //给a【x】加上num,做修改

{

while(x<=N)

{

c[x]+=num;

x+=lowbit(x);

}

}

int main()

{

int n;

scanf("%d",&n);

mem(level);

mem(c);

for(int i=0;i<n;i++)

{

int x,y;

scanf("%d%d",&x,&y);

x++;

level[sum(x)]++;

add(x);

}

for(int i=0;i<n;i++)

printf("%d\n",level[i]);

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: