[NOI2008]糖果雨——数形结合的思想

题目描述:

维护一个线段集合支持以下操作:

1. add T L R D :在T秒时加入一条L至R的线段,运动方向为D(每秒向右移动D个单位),D为1或-1。

2. ask t L R: 询问t时刻有多少个线段与L~R这个区间相交。

3.del X: 删除某线段。

地图左界为0,右界为len。线段长度不超过len。

每一秒线段们都在运动(= =||好喜感),当一条线段左端点碰到地图左界或右界时运动方向会改变。


数据范围:操作数≤20w,len≤1000。


问题分析:

吐槽一下:noi2008好强啊~ 这神题完全不会 T_T, 果然我的思维能力太弱了…… 

不过,这类数形结合的题还是很少见的呢。


不难发现,线段的运动是以2*len为周期的。这样所有时间均能划到模意义下。

为了统一,不妨把每条线段都表示成(x,y)——在x秒诞生的长y的线段。这样,每条线段对与平面内一个点唯一对应~


现在考虑询问:简单起见,不妨令t=0,观察平面内满足L,R要求的区域。

(请原谅我的手残 >_<

这么考虑:

0s诞生的线段,长度至少要L才相交得到。

1s诞生的线段,考虑到这是模系(不然怎么会在1s后的未来诞生),比前者慢了1s,所以位置靠后1,相应长度要求只有L-1。

……

右半边是对称考虑的。实在想不清的话,画个图打点点就好了…… =w= ||

至于t>0的情况,考虑方法同上,只不过图形向右平移了t格。但右端溢出部分会出现在左边,为了方便,不妨把坐标系内信息复制一份接在右边。


至此,问题已经转化成了——平面内单点修改,区域求和。

因为是平行四边形所以有点麻烦,但可以维护两个扭曲的坐标系,使得这两个图形变成矩形。映射关系要想清楚。

最后变成矩形区域求和——二维树状数组就行了。


最后说下几个细节:

1.算左不算右,因为0s和2*len s是同一时间。

2.L=R=0时和R=len时注意特判。


巧妙利用数形结合建模的一道神题啊。 =。= ~




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值