这题首先要看清题意,因为输入是按Y轴升序排列,Y相同按X轴升序排列,所以只需每次输入时查询此时小于等于他的X的个数,便是星星的等级。
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#define mem(a) memset(a, 0, sizeof(a))
#define maxn 32000
using namespace std;
int ans[maxn + 5], ress, flag;
struct tree
{
int sum;
}tr[maxn * 4 + 5];
void build(int l, int r, long n)
{
tr[n].sum = 0;
if(l == r)
return;
int mid = (l + r) / 2;
build(l, mid, n * 2);
build(mid + 1, r, n * 2 + 1);
}
void add(int l, int r, long n, int x)
{
if(flag == 1)
return;
tr[n].sum++;
if(l == r&&l == x)
{
flag = 1;
return;
}
int mid = (l + r) / 2;
if(x <= mid)
add(l, mid, n * 2, x);
else
add(mid + 1, r, n * 2 + 1, x);
}
void res(int l, int r, long n, int x)
{
if(r == x)
{
if(l == 0)
ress += tr[n].sum;
else
{
ress += tr[n].sum;
res(0, maxn, 1, l - 1);
}
return;
}
int mid = (l + r) / 2;
if(x <= mid)
res(l, mid, n * 2, x);
else
res(mid + 1, r, n * 2 + 1, x);
}
int main(int argc, char *argv[])
{
int num, x, y, i;
while(scanf("%d", &num) != EOF)
{
mem(ans);
mem(tr);
build(0, maxn, 1);
for(i = 0;i < num;i++)
{
scanf("%d%d", &x, &y);
ress = 0;
flag = 0;
res(0, maxn, 1, x);
ans[ress]++;
flag = 0;
add(0, maxn, 1, x);
}
for(i = 0;i < num;i++)
{
printf("%d\n", ans[i]);
}
}
return 0;
}