pku2352 Stars(线段树实现)

第一个线段树。。。线段树真是灵活多变啊。。。看来要好好掌握还要多加练习。。
  1. /*pku2352
  2.   Name: Stars
  3.   Date: 02-08-08 16:41
  4.   Description: 统计问题,线段树
  5. */
  6. #include<stdio.h>
  7. #define MAX 72010
  8. #define pr printf
  9. //  FILE * pp=fopen("temp.txt","w");
  10. struct node{
  11.     int count;//被覆盖过的次数 
  12.     int l,r;
  13. }nodes[MAX];
  14. void build(int l,int r,int step){
  15.        int mid;
  16.        nodes[step].r=r;
  17.        nodes[step].l=l;
  18.        nodes[step].count=0; 
  19.        if(r-l>1){
  20.             mid=(r+l)/2;
  21.             build(l,mid,step*2);//l
  22.             build(mid,r,step*2+1);//r
  23.             }
  24.     }
  25. void insert(int l,int r,int step){  
  26.         nodes[step].count++;
  27.         int r0=nodes[step].r,l0=nodes[step].l;
  28.       if(l==l0 && r==r0)return ;
  29.       int mid=(r0+l0)/2;
  30.       if(mid<=l)insert(l,r,step*2+1);
  31.         else if(mid>=r) insert(l,r,step*2);
  32.                 else   insert(mid,r,step*2+1); //线段跨越节点时,插入节点的右子树
  33.                 //新插入的点其实只有r,所以只要在右子树插入就可以了 
  34.       
  35. }
  36. int query(int l,int r,int step){
  37.         int r0=nodes[step].r,l0=nodes[step].l;
  38.     if(l==l0 && r==r0){
  39.         return nodes[step].count;
  40.         }
  41.         int mid=(l0+r0)/2;
  42.         if(mid<=l)return query(l,r,step*2+1);//在右子树上
  43.         if(mid>=r)return query(l,r,step*2);//左子树
  44.         return query(l,mid,step*2)+query(mid,r,step*2+1); 
  45.     }
  46. int ans[15003];
  47. int main(){
  48.     int n,i,x,y;
  49.     scanf("%d",&n);
  50.     for(i=0;i<n;i++)ans[i]=0;
  51.     build(0,32000,1);
  52.     for(i=0;i<n;i++)
  53.     {
  54.         scanf("%d%d",&x,&y);
  55.         ans[query(0,x,1)]++; 
  56.        insert(0,x,1);
  57.            
  58.     }
  59.     for(i=0;i<n;i++)
  60.         pr("%d/n",ans[i]);
  61.         scanf("%d",&i);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值