题意:按纵坐标升序给定N颗星星的坐标(x[i],y[i]),计算出每个等级的星星有多少,
对于等级是这样定义的:对于第i颗星星,计算出1~i-1 颗星星中横坐标和纵坐标都比第i颗星星小的数量ans,
那么ans就是此颗星星的等级。
因为y是升序,所以就以 x 坐标为根节点,记录个数,注意横坐标不能为0 因为,
x += lowbit(x) 将一直未0 死循环,
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
const int maxn = 32100;
int f[maxn], c[maxn];
int lowbit(int x)
{
return x&-x;
}
void add(int x, int d)
{
while(x < maxn)
{
c[x] += d;
x += lowbit(x);
}
}
int sum(int x)
{
int res = 0;
while(x > 0)
{
res += c[x];
x -= lowbit(x);
}
return res;
}
int main()
{
int n;
while(scanf("%d", &n) != EOF)
{
memset(f, 0, sizeof(f));
memset(c, 0, sizeof(c));
for(int i = 0; i < n; i++)
{
int x, y;
scanf("%d%d", &x, &y);
x++;
f[sum(x)]++;
add(x, 1);
}
for(int i = 0; i < n; i++)
printf("%d\n", f[i]);
}
}
poj 2352
最新推荐文章于 2019-08-04 23:28:54 发布