基础代码-线段

问题 B: 线段

时间限制: 1 Sec  内存限制: 128 MB

题目描述

考虑一些在实数轴上的线段,你需要写一个程序处理以下两种询问:

1. 询问 + L R 增加一条线段 [L, R],你的程序应该输出有多少条线段被 该线段包含(非严格)。

2. 询问 - L R 删除线段 [L, R],如果这条线段不存在则忽略这个询问。 

 

输入

输入文件的每一行都包含一个询问,格式如题目所述,你的程序应该 处理到文件结束为止。 

 

输出

对于每一个 “+” 询问,输出一个整数,代表被该线段包含的线段条 数。 

 

样例输入

+ 1 2
+ 1 2
+ 0 3
- 1 2
+ 1 2

样例输出

0
1
2
1

提示

对于所有数据,询问的个数不超过 25000 个,任意时刻数轴上的线段 不超过 1000 条, L, R 均在 32 位有符号整数的表示范围之内。 
 
这题只需要简单模拟。将l与r依次存入,删除时将删组之后的组都往前移一位即可。
 
Code:
 
var
  ch:char;i,j,x,y,ans,tot:longint; 
  l,r:array[1..1005] of longint; 
procedure add(x,y:longint); 
begin
  inc(tot); 
  l[tot]:=x;r[tot]:=y; 
end; 
begin
  while not(eof) do
  begin
    read(ch); 
    if ch='+' then
    begin
      readln(x,y); 
      ans:=0; 
      for i:=1 to tot do
        if (x<=l[i])and(y>=r[i]) then
          inc(ans); 
      add(x,y); 
      writeln(ans); 
    end else
    begin
      readln(x,y); 
      for i:=tot downto 1 do
        if (l[i]=x)and(r[i]=y) then
        begin
          for j:=i to tot-1 do
          begin
            l[j]:=l[j+1]; 
            r[j]:=r[j+1]; 
          end; 
          dec(tot); 
          break; 
        end; 
    end; 
  end; 
end. 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JackflyDC

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值