线段树经典题(3.0版)

题目大意:x轴上有若干条不同线段,问某个单位区间[x,x+1]上重叠了多少条线段?

数据:             输出:3

5 20

10 19

2 9

5 13

15 17

13 19

15 16

 

分析:我们只考虑小数据,在例三的基础上加一个域count,表示区间内的重叠的线段的数量,统计即可。

 

const

 maxn=100000;

type

 treenode=record

  cover,count:longint;

end;

 

var

 tree:array [0..maxn] of treenode;

 n,ans,pl,l:longint;

procedure insert(p,l,r,a,b:longint);

 varm:longint;

begin

 m:=(l+r) div 2;

 if(a=l) and (b=r) then

 tree[p].count:=tree[p].count+1

  else begin

   if b<=m then insert(p*2,l,m,a,b)

     else if a>=m then insert(p*2+1,m,r,a,b)

     else begin

      insert(p*2,l,m,a,m);

      insert(p*2+1,m,r,m,b);

     end;

  end;

end;

 

function count(p:longint):longint;

 var

 result:longint;

begin

 result:=0;

 while p>0 do

 begin

  result:=result+tree[p].count;

  p:=p div 2;

 end;

 count:=result;

end;

 

procedure find(p,l,r,a,b:longint);

 var

 m:longint;

begin

 m:=(l+r) div 2;

 if(l=a) and (r=b) then

 pl:=p

 else if m>=b then

  find(2*p,l,m,a,b)

  else if a>=m then

   find(2*p+1,m,r,a,b)

   else begin

        find(2*p,l,m,a,m);

        find(2*p+1,m,r,m,b);

        end;

end;

 

procedure main;

 vara,b,i,c:longint;

begin

 readln(n,l);

  fori:=1 to n do

   begin

    readln(a,b);

    insert(1,1,l,a,b);

   end;

 readln(a,b);

 find(1,1,l,a,b);

 writeln(count(pl));

end;

 

begin

 main;

end.

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值