poj2352题解

线段树经典入门题,线段树本弱是一个半月前听的课,没练题,今天第一次做线段树,一个半小时。。。。
这道题由于数据给出是按y递增的,所以难度降低了,否则应该是先根据y大小由小到大来排序。刚开始我不知道要维护那些数据,翻了一下当时的课件,才渐渐理解只需记录元素个数。。。。tree数组要比maxn大两倍(理论上好像是,一般直接三倍)

#include <stdio.h>
#include <string.h>
int level[15001],N,tree[96000];
int x[32001];
void Buildtree(int tn,int left,int right,int x)
{
    int mid;
    if(left==right) {tree[tn]++;    return;}
    mid=(left+right)>>1;
    if(mid>=x)
    Buildtree(tn<<1,left,mid,x);
    else Buildtree(tn<<1|1,mid+1,right,x);
    tree[tn]=tree[tn<<1]+tree[tn<<1|1];
}
int Find(int tn,int left,int right,int x)
{
    int mid;
    if(left==right) return tree[tn];
    mid=(left+right)>>1;
    if(mid>=x) return Find(tn<<1,left,mid,x);
    else return  tree[tn<<1]+Find(tn<<1|1,mid+1,right,x);
}
int main(int argc, char const *argv[])
{
    int i,tmpx,tmpy;
    scanf("%d",&N);
    memset(level,0,15001*sizeof(int));/*没有这个也可以,因为是在函数外开的,初始值也是0*/
    memset(tree,0,96000*sizeof(int));
    for(i=0;i<N;i++)
    {
        scanf("%d %d",&tmpx,&tmpy);
        Buildtree(1,0,32000,tmpx);
        level[Find(1,0,32000,tmpx)-1]++;
    }
    for(i=0;i<N;i++)
        printf("%d\n",level[i] );
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值