【八校联考2013】百团大战
2015-08-03 20:06
141 查看
题目大意
在数轴上,每一秒可以移动vv个单位,有nn个得分点,在tit_i时刻移动到xix_i可以得到一分。问:若时刻00在00这个位置则最多可以得多少分?若时刻00在任意位置最多可以得多少分?1<=n<=100000,|xi|<=200,000,000,1<=Ti<=1,000,0001<=n<=100000, |x_i|<=200,000,000, 1<=Ti<=1,000,000
我的分析
这道题在做的时候我用的是O(nlog2n)O( nlog^2n)的树状数组套动态开点的线段树。然而这种做法线段树是可以略去的= =,主要是式子里的一些性质没有找出来。我的方法思路主要如下。首先先把ti=0和xi=0t_i=0和x_i=0这个的得分点加入所有点中,然后倒着做,设i,ji, j是两个不同的得分点且ti>tjt_i>t_j,若从ii可以到jj,则有
|xi−xj|<=(ti−tj)v|x_i-x_j|<=(t_i-t_j)v
因为是绝对值小于某个数,那么不妨忽略掉负的,则有
xi−tiv<=xj−tjvx_i-t_iv<=x_j-t_jv
且
−xi−tiv<=−xj−tjv-x_i-t_iv<=-x_j-t_jv
两者同时成立。
如果将xi−tivx_i-t_iv和−xi−tiv-x_i-t_iv分别作为xx坐标和yy坐标来将这些点投影到二维平面上,那么如果两个点可以转移那么两个点与原点构成的矩形必定是包含关系,只需要按xx坐标排序,yy坐标用树状数组维护,再用以tit_i为关键字的线段树来维护最大值就可以做出来了。
但是考虑左边是绝对值,如果上面的式子成立的话那么右边必定为正,那么就是说不需要判断tit_i的关系了。那么就是按xx坐标排序然后用树状数组维护yy坐标进行转移就可以了。
另一种思路
另外还有一个方法,首先把tit_i全部乘vv,也就是把一秒走vv步变成vv秒走vv步,那么可以转移的部分形成了一个等腰直角三角形,将坐标系旋转π4\frac{\pi}{4},用扫描线来维护转移就可以了。一些奇怪的东西
题目要求输出两个数在一行,然而我输出到了两行导致比赛时这道题爆零了。对拍了个半年,昨天是对拍写错了,今天是格式不对。简直了。相关文章推荐
- (一〇四)使用Xcode6创建framework动态静态库
- poj 3160 Father Christmas flymouse【强连通 DAG spfa 】
- leetcode 69: Sqrt(x)
- 字符编码
- 服务器中很多的CLOSE_WAIT
- jni 字符串转化为 char* 的方法
- javascript 没有块级作用域 JavaScript声明全局变量三种方式 及
- hdu 5329 Question for the Leader
- week6-week11
- 2015暑假训练赛团体赛(DLX+Trie模糊匹配+费用流)
- iOS项目中重定义NSLog方法
- HDU 2795 Billboard(线段树啊 )
- RedHat 7.0 Linux 下划分区,分区加密,配额,逻辑卷管理
- C调用java代码
- 【Random Forest】林轩田机器学习技法
- <转载>Android 工程报错解决 Unable to resolve target 'android-17'
- 关于virtualbox共享文件夹,如何添加
- Traffic jam caused by the rain (3rd Aug.2015)
- c++实现基于单进程单客户编程模型的echo程序
- 同步