题意:找出坐标系中一个点的左下方有多少点
思路:题目输入是按照从下向上,从左向右输入,所以,按照横坐标的值建立树状数组。每次查询只要是横坐标小于当前坐标的,就一定是在左下方
代码如下:
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const int maxn=32005;
int C[maxn];
int ans[15005];
int x[15005];
int y[15005];
int maxc=-1;
int lowbit(int x)
{
return x&-x;
}
void update(int x)
{
while(x<=maxc){
C[x]++;
x+=lowbit(x);
}
}
int query(int x)
{
int ret=0;
while(x>0){
ret+=C[x];
x-=lowbit(x);
}
return ret;
}
int main()
{
// freopen("data.txt","r",stdin);
int n;
scanf("%d",&n);
for(int i=0;i<n+1;++i){
ans[i]=0;
}
for(int i=0;i<n;++i){
scanf("%d%d",&x[i],&y[i]);
x[i]++;
y[i]++;
maxc=max(maxc,x[i]);
}
for(int i=0;i<maxc;++i){
C[i]=0;
}
for(int i=0;i<n;++i){
int a=query(x[i]);
ans[a]+=1;
update(x[i]);
}
for(int i=0;i<n;++i){
printf("%d\n",ans[i]);
}
return 0;
}