poj 2352(树状数组)
题意:按y递增的顺序给出n颗星星的坐标(y相等则x递增),每个星星的等级,等于在它左边且在它下边(包括水平和垂直方向)的星星的数量,求出等级为0到n-1的星星分别有多少个。
代码:
#include<iostream>
#include<fstream>
using namespace std;
int n,m;
struct e{
int s,t;
};
e a[15001];
int b[32020];
int lowbit(int x){
return x&(-x);
}
void add(int s){
while(s<=m)
{
b[s]++;
s+=lowbit(s);
}
}
int getsum(int s){
int i=0;
while(s>0)
{
i+=b[s];
s-=lowbit(s);
}
return i;
}
int ans[15001];
void read(){
// ifstream cin("in.txt");
int i,j,k;
// cin>>n;
scanf("%d",&n);
for(i=1;i<=n;i++)
{
// cin>>a[i].s>>a[i].t;
scanf("%d%d",&a[i].s,&a[i].t);
a[i].s++;
a[i].t++;
m=max(m,a[i].s);
}
for(i=1;i<=n;i++)
{
j=getsum(a[i].s);
ans[j]++;
add(a[i].s);
}
for(i=0;i<n;i++)
cout<<ans[i]<<endl;
}
int main(){
read();
return 0;
}
浙公网安备 33010602011771号