CF1525C Robot Collisions

传送门

题目大意

在一条数轴上有 n n n 个机器人,每个机器人有一个初始的朝向,之后每一秒,它会向着它朝向的方向走一个单位,如果到达了 0 0 0 或者 m m m 那么就会立即掉头。如果多个机器人在同一整数点相遇,那么它们就会碰撞炸掉,在此之后就不会与其他机器人碰撞了。现需要你求出每个机器人最早在第几时刻炸掉,如果不会,则输出 -1

Solution

首先是注意一点:当且仅当两个机器人奇偶性相同时才会相撞,并且没有意外是一定会相撞的。

可以很简单地证一下,每一次移动每一个机器人的位置奇偶性都会改变,如果两个机器人的奇偶性不同,那么任意时刻其奇偶性都是不同的,也就不可能同时在一个整数点相遇了。

所以我们可以对每个点进行奇偶分类。

然后对于每组,我们考虑机器人相撞,可以发现如果两个机器人是相对的并且中间没有其他机器人,那么必定是这两个机器人相撞……等等,这不就是括号匹配么。所以用一个栈维护一下就可以把所有相对的机器人处理掉,最后只剩下:L...LR...R 这样的朝向,此时,我们对两边分别进行处理,对于向左的,最左边转向后必定和左边第二个相撞,左边第三个必定转向后和左边第四个相撞……右边也是同理。

这样处理完后,可能会剩下 1 1 1 个或者 2 2 2 个机器人,如果是 1 1 1 个,那么没有人与之相撞,则答案为 -1,否则,剩下 2 2 2 个朝向是这样的:LR,让它们两个走到头再转向回来相撞即可。

Code

#include<bits/stdc++.h>
#define ll long long
#define inf 1<<30
#define int long long
using namespace std;
const int MAXN=3e5+10;
struct node{
   
	int pos,id;
	char dir;
	node(){
   }
	node(int _pos,int _id,char _dir){
   
		pos=_pos;id=_id;dir=_dir;
	}
	bool friend operator<(node a,node b){
   
		return a.pos<b.pos;
	}
}odd[MAXN],eve[MAXN],bas[MAXN];
int stk[MAXN],top,ans[MAXN];
int bin[MAXN],hed;
void 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值