题解/算法 {\2957. 赛车}

题解/算法 {\2957. 赛车}

LINK: https://www.acwing.com/problem/content/2960/;

#提示#: t=0起始时刻 也算作答案;

#题意转换#: 即若干个k,b >=0的直线, ∀ x ≥ 0 \forall x \geq 0 x0 对于一个直线L 如果他的y值 L ( x ) L(x) L(x) ≥ \geq 其他所有直线的y值, 那么这个L直线 要记录到答案里;

将直线看做是 (方向朝右上的)有向直线后, 求出半平面交(一定是无限区域(单开口)类型) 那么所有与半平面交 在 x ≥ 0 x\geq 0 x0处 有接触的 有向边 就是答案;
. 一种做法可以这样直接做, 然后再去
特判
把处在 x < 0 x < 0 x<0区域的有向边 给去掉; 但这比较麻烦;
更简洁的做法是: 添加一个辅助边 方向朝下的Y轴, 此时 半平面交一定是在第一象限, 最终求出的答案(一定包含这个辅助边) 除了这个辅助边 剩下的都是答案;

由于算法会进行去重 而答案会出现重复边, 因此 你需要对重复边 进行记录; 使用map< DirectedLine, vector<int>> 存储所有重复的有向边;

map< __Geometry2D::DirectedLine, vector<int> > Mp;

void Add_directedLine( const __Geometry2D::DirectedLine & _directedLine){ // 该有向直线的*左侧区域*为目标区域
	Mp[ _directedLine].push_back( __DirectedLines.size()); // 存储重复边
}


vector< int> ANS;
for( auto i = QueHead; i <= QueTail; ++i){
	auto t = Mp[ get<0>( __DirectedLines[ Que[i]])];
	for( auto j : t){
		if( j >= 1) // 辅助边的ID号为`0`, 其他的为`> 0`;
			ANS.push_back( j);
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值