poj1177——Picture

线段树+离散化+扫描:

离散化的概念可以参考99年国家集训队陈宏的论文。

重点理解两个公式:[1]   ans+= st[ 1 ]. segnum * 2 *( yline[ i+1 ]. x- yline[ i]. x);

                           [2]    ans+= abs ( st[ 1 ]. sum- lsum);

首先,读入数据,存入yline[]数组中,并将y坐标存入INDEX[]数组中,其中,yline[]的结构应该为:

 ;

接下来,对yline[]数组以x为关键字进行排序,INDEX[]数组同样得排序,并对INDEX[]数组进行去重操作,得到剩下的不同的y值为cnt个;

现在,到了建树阶段:这里建树,是以[0,cnt-1]为起始点建树的,也就是说st[1].l=0,st[1].r=cnt-1;因为这样建的树的话,每个节点的l,r值是和INDEX[]数组里面的y值相对应的,而且,用的是超元线段,这样,可以节省很多空间和操作的时间,当然,建完树,应该顺便初始化的,st[max]的结构是:

 

现在,从0开始,对yline[]数组进行扫描,扫描到左边,进行Insert操作,如果是右边,则进行Delete操作,并且,每次都对数进行更新,即getlen ( index)和 getsegnum ( index)两个操作

对于ans+= abs ( st[ 1 ]. sum- lsum),这个等式,应该不难理解,每次加上|线段树中所覆盖的总长度-上次还剩的长度|即更新的长度;

而 ans+= st[ 1 ]. segnum * 2 *( yline[ i+1 ]. x- yline[ i]. x)中, 难理解的是 st[ 1 ]. segnum 。对于这个的值,就是该区间中,有多少的不相交的段数。而求这个值的过程中,就用的了cover、st[i].lcover、st[i].rcover,而且,对轴进行了离散化。自己理解下,不是很好明白,但你必须弄懂!

现在贴上代码:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值