jzoj 1435. 开花

38 篇文章 0 订阅
32 篇文章 0 订阅

Description

  在遥远的火星上,上面的植物非常奇怪,都是长方形的,每个植物用三个数来描述:左边界L、右边界R以及高度H,如下图所示描述一个植物:L=2,R=5和H=4。
  
  每天都有一个新植物长出来,第一天的植物高度为1,后面每天长出的植物比前一天的高1。
  当一个新植物长出来的时候,跟其他植物的水平线段相交处会长出一朵小花(前提是之前没有长出花朵),如果线段交于端点,是不会长花的。
  下图为样例1的示意图:
  

  给出每天的植物的坐标,计算每天长出多少新花。

Input

  第一行包含一个整数N(1<=N<=100000),表示天数。
  接下来N行,每行两个整数L和R(1<=L<=R<=100000),表示植物的左右边界。

Output

  输出每天长出新植物后增加新花的数量。

Sample Input

输入1:
4
1 4
3 7
1 6
2 6

输入2:
5
1 3
3 5
3 9
2 4
3 8

Sample Output

输出1:
0
1
1
2

输出2:
0
0
0
3
2

Data Constraint

正解

这题很显然是树状数组(当然也可以用线段树),它要求的就是单点查询和区间修改。虽然线段树好理解好打,但如果比复杂度的话,我建议你写树状数组。

CODE(树状数组)

const
        max=100100;
var
        a:array[0..100000]of longint;
        f:array[0..900000]of longint;
        n,i,l,r:longint;
function lowbit(k:longint):longint;
begin
        exit(k and -k);
end;
procedure get(k,x:longint);
begin
        while k<max do begin
                f[k]:=f[k]+x;
                k:=k+lowbit(k);
        end;
end;
function ans(k:longint):longint;
begin
        ans:=0;
        while k>0 do begin
                ans:=ans+f[k];
                k:=k-lowbit(k);
        end;
end;
begin
        readln(n);
        for i:=1 to n do begin
                readln(l,r);
                writeln(ans(l)+ans(r)-a[l]-a[r]);
                a[l]:=ans(l);
                a[r]:=ans(r);
                get(l+1,1);
                get(r,-1);
        end;
end.

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值