poj 2353——Stars

来源:互联网 发布:虚拟仿真软件哪种好 编辑:程序博客网 时间:2024/06/06 06:56

题意:找出坐标系中一个点的左下方有多少点
思路:题目输入是按照从下向上,从左向右输入,所以,按照横坐标的值建立树状数组。每次查询只要是横坐标小于当前坐标的,就一定是在左下方
代码如下:

#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;}
0 0
原创粉丝点击