题意:
给出星星坐标,判断星星左下部分的星星的个数,其中y是按照升序排列的,所以只对x进行判断即可
代码实现如下:
#include<iostream>
#include<vector>
#include<cstdio>
using namespace std;
vector <int> cnt;
vector <int> arr;
inline int lowbit(int x)
{
return x&(-x);
}
void add(int index , int addnum)
{
int Size = arr.size();
while(index < Size)
{
arr[index] += addnum;
index += lowbit(index);
}
}
int sum(int index)
{
int ssum = 0 ;
while(index > 0)
{
ssum += arr[index];
index -= lowbit(index);
}
return ssum;
}
int main()
{
int n = 0 ;
while(scanf("%d",&n)!=EOF)
{
cnt.assign(15010,0); //assign all of them to 0;take place of the memset;
arr.assign(32010,0);
for(int i = 0 ; i < n; i++)
{
int x, y;
scanf("%d%d",&x,&y);
int tmp = sum(x+1);
cnt[tmp]++;
add(x+1,1);
/*这里用到的是x+1,是因为如果在lowbit函数中x如果是0,将会无限循环,所以为了保险起见将所有的x的坐标都加一*/
}
for(int i = 0 ; i < n ; i++)
printf("%d\n",cnt[i]);
}
return 0;
}
assign是用来初始化一个vector数组的,普通数组要用到的是memset(#include )