【八校联考2013】百团大战

本文探讨了一道关于在一维数轴上移动并获取得分的算法题。通过使用树状数组和动态开点的线段树,分析了如何在特定时间内达到得分最大化的方法。文章还提出了一种坐标旋转和扫描线的替代解法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

题目大意

在数轴上,每一秒可以移动v个单位,有n个得分点,在ti时刻移动到xi可以得到一分。问:若时刻00这个位置则最多可以得多少分?若时刻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

两者同时成立。
如果将xitivxitiv分别作为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、付费专栏及课程。

余额充值