POJ 2352 (stars)
【题意描述】
就是给定n个星星的x,y坐标,y坐标按照从小到大的顺序进行排列,x坐标随机排列。下面求对于每个星星而言,其它星星的x,y的坐标都小于等于该星星的数目,然后输出所有的情况。
【思路分析】
我们这道题可以采用树状数组求解,将x+1作为树状数组的底标。
【AC代码】
#include<iostream>
#include<bitset>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<string>
#include<cstdlib>
using namespace std;
#define MAXN 40000
int n;
int c[MAXN]; //树状数组
int a[MAXN];
int x_c[MAXN];
int lowbit(int t)
{
return t&(-t);
}
int sum(int i)
{
int s=0;
while(i>0)
{
s+=c[i];
i-=lowbit(i);
}
return s;
}
void modify(int i,int x)
{
while(i<=MAXN)
{
c[i]+=x;
i+=lowbit(i);
}
}
void solve()
{
int x;
memset(a,0,sizeof(a));
memset(c,0,sizeof(c));
for(int i=1;i<=n;i++)
{
scanf("%d",&x);
a[sum(x+1)]++;//由于是采用lowbit技术时值一定要大于0,对于x=0的情况,所以把所有的x+1.
modify(x+1,1);
scanf("%d",&x);
}
for(int k=0;k<n;k++)
{
printf("%d\n",a[k]);
}
}
int main()
{
while(scanf("%d",&n)!=EOF)
solve();
return 0;
}