其他分享
首页 > 其他分享> > A - Stars

A - Stars

作者:互联网

  题目:

 

 

题目网址:2352 -- Stars (poj.org)

  思路:

定义星星的等级为左下角星星的个数,给定以y坐标升序的星星输出各级别星星的个数;

因为按照Y坐标升序输入,所以放入一个点后,不会影响到等级比他大的点的个数,所以和它同等级的点的个数应该加一;

  代码实现:

#include<iostream>
#include<cstdio>
#include<string.h>
using namespace std;
int n,x,y,s,a[32005],b[32005];
int cx(int x){//查询
    s=0;//初值
    for(;x;x-=x&(-x))s+=a[x];//累加
    return s;
}
void update(int x)//更改
{
    for(;x<=32001;x+=x&(-x))a[x]++;//寻找父节点更改
}
int main()
{
    while(scanf("%d",&n)!=EOF){
         memset(a,0,sizeof(a));//初始化数组都设为0
         memset(b,0,sizeof(b));
         for(int i=1;i<=n;i++)
         {
             scanf("%d%d",&x,&y);//由于以Y的升序输入所以与Y坐标无关
             b[cx(x+1)]++;//查询点的等级
             update(x+1);//更改
         }
         for(int i=1;i<=n;i++)
             printf("%d\n",b[i-1]);
    }
   return 0;
}

 

 

#include<iostream>#include<cstdio>#include<string.h>using namespace std;int n,x,y,s,a[32005],b[32005];int cx(int x){    s=0;    for(;x;x-=x&(-x))s+=a[x];    return s;}void update(int x){    for(;x<=32001;x+=x&(-x))a[x]++;}int main(){    while(scanf("%d",&n)!=EOF){         memset(a,0,sizeof(a));         memset(b,0,sizeof(b));         for(int i=1;i<=n;i++)     {             scanf("%d%d",&x,&y);             b[cx(x+1)]++;             update(x+1);         }         for(int i=1;i<=n;i++)             printf("%d\n",b[i-1]);    }   return 0;}

 

标签:星星,int,个数,Stars,升序,32005,include
来源: https://www.cnblogs.com/wangdy/p/15108372.html