【八校联考2013】百团大战

题目大意

在数轴上,每一秒可以移动 v 个单位,有n个得分点,在 ti 时刻移动到 xi 可以得到一分。问:若时刻 0 0这个位置则最多可以得多少分?若时刻 0 在任意位置最多可以得多少分?

1<=n<=100000,|xi|<=200,000,000,1<=Ti<=1,000,000


我的分析

这道题在做的时候我用的是 O(nlog2n) 的树状数组套动态开点的线段树。然而这种做法线段树是可以略去的= =,主要是式子里的一些性质没有找出来。

我的方法思路主要如下。首先先把 ti=0xi=0 这个的得分点加入所有点中,然后倒着做,设 i,j 是两个不同的得分点且 ti>tj ,若从 i 可以到j,则有

|xixj|<=(titj)v

因为是绝对值小于某个数,那么不妨忽略掉负的,则有

xitiv<=xjtjv

xitiv<=xjtjv

两者同时成立。
如果将 xitiv xitiv 分别作为 x 坐标和y坐标来将这些点投影到二维平面上,那么如果两个点可以转移那么两个点与原点构成的矩形必定是包含关系,只需要按 x 坐标排序,y坐标用树状数组维护,再用以 ti 为关键字的线段树来维护最大值就可以做出来了。

但是考虑左边是绝对值,如果上面的式子成立的话那么右边必定为正,那么就是说不需要判断 ti 的关系了。那么就是按 x 坐标排序然后用树状数组维护y坐标进行转移就可以了。


另一种思路

另外还有一个方法,首先把 ti 全部乘 v ,也就是把一秒走v步变成 v 秒走v步,那么可以转移的部分形成了一个等腰直角三角形,将坐标系旋转 π4 ,用扫描线来维护转移就可以了。


一些奇怪的东西

题目要求输出两个数在一行,然而我输出到了两行导致比赛时这道题爆零了。对拍了个半年,昨天是对拍写错了,今天是格式不对。简直了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值