HDU 1541 Stars 解题报告
题意:每个星星都有自己的level,level等于位于该颗星星左下方的星星数量(包括同行同列的星星),输出从0到N-1各个level的星星数量。
解题思路:输入的数据已经排好序了,y没用,只考虑x就行了,不难,用树状数组就行,看代码吧。记得用while输入n,不然会wa。
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<iostream>
#include<math.h>
#include<iomanip>
#include<algorithm>
#include<queue>
#include<cstring>
#include<string>
#include<map>
#include<stack>
#include<stdio.h>
#include<cstdio>
#include<stdlib.h>
#include<fstream>
#include<iomanip>
#pragma warning(disable:4996)
#define INF 0x3f3f3f3f
#define ll long long
#define PI acos(-1.0)
const int N = 200010;
const int maxn = 1e9;
using namespace std;
int n;
int a[40000];
int sum[40000];
int lowbit(int x)
{
return x & (-x);
}
void Add(int x)//将新星星加入
{
for (int i = x; i <= 40000; i += lowbit(i))
{
a[i] += 1;
}
}
int get_sum(int x)//获取等级
{
int total = 0;
for (int i = x; i >= 1; i -= lowbit(i))
{
total += a[i];
}
return total;
}
int main()
{
while (~scanf("%d", &n))
{
memset(a, 0, sizeof(a));
memset(sum, 0, sizeof(sum));
int x, y;
for (int i = 1; i <= n; i++)
{
scanf("%d%d", &x, &y);
x++;
sum[get_sum(x)]++;
Add(x);
}
for (int i = 0; i < n; i++)
{
printf("%d\n", sum[i]);
}
}
}