您的位置:首页 > 其它

HDU 1541 Stars (树状数组)

2014-09-18 21:07 357 查看
题意:直角坐标系上有n个点 每个点的值为它左下的点的数量

求0。。。n-1每个数值出现的次数

思路:题目中已经给出y递增 x在y相同时递增

从而可以一边输入一边利用树状数组将结果求出

每次输入时 先计算出 sum(x+1) (由于树状数组下标从1 开始 ,所以每个值都加1,否则会超时)

再 add(x)

最后统计结果

#include<cstdio>
#include<cstring>
#include<iostream>
using namespace std;
int c[50000],num[50000];
int N=32100;
int lowbit(int x)
{
return x&(-x);
}
int sum(int x)
{
int ret=0;
while(x>0)
{
ret+=c[x];
x-=lowbit(x);
}
return ret;
}
void add(int x,int d)
{
while(x<=N)
{
c[x]+=d;
x+=lowbit(x);
}
}
int main()
{
int t;
int i,j;
while(cin>>t)
{
memset(c,0,sizeof(c));
memset(num,0,sizeof(num));
for(i=0;i<t;i++)
{
int x,y;
scanf("%d%d",&x,&y);
num[sum(x+1)]++;
add(x+1,1);
}
for(i=0;i<t;i++)
{
printf("%d\n",num[i]);
}
}
return 0;
}


  
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: