我的第一道树状数组哇咔咔~~~~~~~~~
大一的时候怎么都看不懂,也许我当时太不用心了吧。。。
题意:
给一些点的坐标,每个点的level是看比它高度低且不在它右边的点的个数。
算法:
由于此题坐标本来就是按y值从小到大,x值从小到大排列的。
所以树状数组中存坐标为x的点的个数。每次读入只要找1-x的sum,然后更新数量+1即可。
注意数组要开到x的最大值32000+。因为这个RE了一次。
#include<cstdio>
#include<iostream>
#include<cstring>
#define maxn 32010
using namespace std;
int level[maxn],c[maxn],n;
int Lowbit(int x)
{
return x&(x^(x-1));
}
int Getsum(int pos)
{
int ret = 0;
while(pos>0)
{
ret += c[pos];
pos-=Lowbit(pos);
}
return ret;
}
void update(int pos)
{
while(pos<=maxn)
{
c[pos]++;
pos+=Lowbit(pos);
}
}
int main()
{
int x,y;
while(scanf("%d",&n)!=EOF)
{
memset(c,0,sizeof(c));
memset(level,0,sizeof(level));
for(int i=0;i<n;i++)
{
scanf("%d%d",&x,&y);
x++;
level[Getsum(x)]++;
update(x);
}
for(int i=0;i<n;i++)
printf("%d\n",level[i]);
}
return 0;
}