C. Robot Collisions(暑期集训)

news2024/11/16 21:56:10

原题链接

 

题意:

 有n个机器人在OX轴上运动,运动范围为[0,m]。

第i个机器人开始位于xi的位置,然后以1单位距离每秒的速度向左或向右运动,当其运动到0点或m点时会调转方向。

如果任意时刻多于一个机器人在同一整数位置,它们将会爆炸,爆炸后不再存在于OX轴上。一开始所有机器人位置不同。

求出每个机器人爆炸的时间,如果永远不会爆炸,输出-1

思路:

机器人在什么时候会碰撞,也就是当俩俩面对面的时候才会碰撞(好吧是一句废话)

给的机器人不一定是按照顺序给的所以要进行排序

换个说法,如果不考虑边界的情况下,机器人会有几种情况,答案是三种:

        相向而行,俩俩之间距离 -2

        背道而驰,俩俩之间距离 +2

        同向而行,永远都不会见面(就像俩个世界的人,永远不会相交(😢))

此时我们在加上边界,那么机器人不管怎么走都也只会这三种情况里面跳转,这个时候你在纸上画个线段就会发现,如果所在下标的奇偶性不同的话,那么这俩个机器人碰撞时间计算怎么算都要 +1,也就是会擦肩而过(因为按照题目的意思来说,只有同时停留在相同整数点上的机器人才会爆炸(所以出生的位置就有时候能决定俩个人能不能相遇(😢))所以得出结论:它们初始坐标差为偶,那么它们一定会碰撞,因为边界的存在。

这个时候我们把下标同为奇和偶分开来求。其实就相当于一个括号匹配的过程,只有“)(”这样的括号才会碰撞,因为机器人是会动的,所以怎么去找到“)(”这样状态的括号,就可以用栈去模拟,“R”都往栈里面塞,“L”出现之后,弹出栈尾,进行碰撞

当我们知道哪两个机器人将会碰撞时,就可以进行碰撞事件的计算,假设两机器人初始坐标为x1,x2(x1<x2)(这俩点之间的差为偶数,也就是下标奇偶性相同,那么碰撞时间为:

初始方向为R,L: (x2 − x1) / 2

初始方向为L,R: m − (x2 − x1) / 2

初始方向为L,L: (x1 + x2) / 2

初始方向为R,R: m-(x1 + x2)/ 2



#include<iostream>
#include<cmath>
#include<cstring>
#include<cstdio>
#include<stack>
#include<string>
#include<algorithm>
#include<unordered_map>
#include<map>
#include<cstring>
#include <unordered_set>
//#include<priority_queue>
#include<queue>
#include<set>
#include<stdlib.h>
#define dbug cout<<"hear!"<<endl;
#define rep(a,b,c) for(ll a=b;a<=c;a++)
#define per(a,b,c) for(ll a=b;a>=c;a--)
#define no cout<<"NO"<<endl;
#define yes cout<<"YES"<<endl;
#define endl "\n"
#define IOS ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
//priority_queue<int,vector<int>,greater<int> >q;
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> PII;
typedef pair<long double,long double> PDD;

 ll  INF = 0x3f3f3f3f;
//const ll LINF=LLONG_MAX;
ll gcdd(ll a, ll b)
{
      while(b^=a^=b^=a%=b);    
      return a;
}
// ll lcmm(ll a,ll b)
// {
//     ll ans;
//     ans=a/gcdd(a,b)*b;
//     return ans;
// }

 
//ll idx;
const ll N = 2e6+ 10;
const ll mod =998244353;
ll t,n,m,x,y,ca;
ll arr[N],brr[N],crr[N];
ll book[N];
// ll ne[N],e[N],w[N];
// ll h[N],idx;
// void add(ll a,ll b, ll c)
// {
//   e[idx] = b, w[idx] = c, ne[idx] = h[a], h[a] = idx ++ ;
// }

struct node
{
  ll x, id;
  ll flag;
}noda[N];

bool cmp(node a,node b)
{
  return a.x<b.x;
}

void fatchuan()
{
 // vector< pair<ll,char> >ve;
  cin>>n>>m;
  rep(i,1,n)
  {
    
    cin>>noda[i].x;
    noda[i].id=i;
    arr[i]=-1;
  }
  rep(i,1,n)
  {
    char p;
    cin >> p;
    if(p == 'R')noda[i].flag = 1;
    else noda[i].flag = 0;
  }
  sort(noda + 1, noda + 1 + n, cmp);

  stack<ll>st;

  rep(i,1,n)
  {
    if(noda[i].x % 2 == 1)continue;
    if(st.empty())
    {
      st.push(i);
      continue;
    }
    if(noda[i].flag == 1)
    {
      st.push(i);
    }else
    {
        ll he = st.top();
        st.pop();
        ll time = (noda[i].x - noda[he].x) / 2;
        if(noda[he].flag == 1)
        {
          arr[noda[he].id] = time;
          arr[noda[i].id] = time;
        }else{
            arr[noda[he].id] = time + noda[he].x;
            arr[noda[i].id] = time + noda[he].x;
        }

    }

  }

  while (st.size() >= 2) {
        ll i = st.top();
        st.pop();
        ll j = st.top();
        st.pop();
        if (noda[i].flag != noda[j].flag) {
            arr[noda[i].id] = arr[noda[j].id] = m - (noda[i].x - noda[j].x) / 2;
           
        }else
        {
          arr[noda[i].id] = arr[noda[j].id] = (m - (noda[i].x + noda[j].x) / 2);
        }
    }

    while (!st.empty()) st.pop();

  rep(i,1,n)
  {
    if(noda[i].x % 2 == 0)continue;
    if(st.empty())
    {
      st.push(i);
      continue;
    }
    if(noda[i].flag == 1)
    {
      st.push(i);
      continue;
    }else
    {
        ll he = st.top();
        st.pop();
        ll time = (noda[i].x - noda[he].x) / 2;
        if(noda[he].flag == 1)
        {
          arr[noda[he].id] = time;
          arr[noda[i].id] = time;
        }else{
            arr[noda[he].id] = time + noda[he].x;
            arr[noda[i].id] = time + noda[he].x;
        }

    }

  }

  while (st.size() >= 2) {
        ll i = st.top();
        st.pop();
        ll j = st.top();
        st.pop();
        if (noda[i].flag != noda[j].flag) {
            arr[noda[i].id] = arr[noda[j].id] = m - (noda[i].x - noda[j].x) / 2;
        }else
        {
          arr[noda[i].id] = arr[noda[j].id] = (m - (noda[i].x + noda[j].x) / 2);
        }
    }


  rep(i,1,n)
  {
     cout<<arr[i]<<' ';
  }
  cout<<endl;

}


int main()
{
    IOS;
    t=1;
    //scanf("%d",&t);
    cin>>t;
    ca=1;
    while(t--)
    {
      fatchuan(); 
      ca++;
    }    
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/695447.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【硬件自动化测试--测试软件的设计及实现】测试框架设计及实现!

如何设计并实现自动化框架? 首先,需要了解我们的产品,需要做哪些测试,如有很多硬件产品的测试中,需要用到示波器、频谱仪、信号源等等一系列的仪器,仪器的型号也各有不同,所以在设计框架之前,一定得了解我们的产品。 那么,就以一台服务器为例子,基带部分的测试,包括…

酷开系统 |酷开科技持续创造大屏生命力

在这个信息爆炸的时代&#xff0c;人们对于互联网和智能生活的需求&#xff0c;不再局限于碎片化或工作场景&#xff0c;更多的是延伸至连续化的家庭化使用环境。而智能大屏作为互联网时代下的产物&#xff0c;融合了互联网流媒体的数据处理方式&#xff0c;深受年轻人的青睐&a…

牛客·矩阵取数游戏

矩阵取数游戏 这里我们推一下这个题的精髓&#xff1a; dp[i][j]max(int(b[c][i])dp[i1][j],dp[i][j-1]int(b[c][j])) dp[i][j]2*dp[i][j]假定某一行有两个数x,y; 那么我们有两种选择&#xff1a; 先拿x&#xff0c;再拿y&#xff1a;x*2y*4&#xff1b; 先拿y&#xff0c;再…

Rust in Action笔记 第八章 网络

P253的图展示了网络各层用到的协议Box<dyn std::error::Error>表示一个指针指向的实现了标准错误库的类型&#xff0c;dyn表明这是一个特征对象&#xff08;trait object&#xff09;&#xff0c;是rust里多态的一种实现方式&#xff1b;特征对象和模板对象&#xff08;g…

短视频------Adobe Photoshop 笔记总结

一、Adobe Photoshop 使用方式方法 ctrlc/v 复制 粘贴 ctrlx 剪切 ctrla 全选 ctrlz撤销 ctrls保存 ENTER 回车 换行 CTRL 调取定界框 CAPSLOCK 大写锁定 Esc 退出 Delete 删除 Backspace 退格 Ctrl shi alt 三个控制键 Shi 连选 ctrl 加选/减选 锁屏 WinL 打开运行命令窗口 …

vue实现输入网址生成二维码、解码、下载、更改功能

功能&#xff1a; 1.输入网址生成二维码 2.二维码可以下载 3.可以更改二维码中心的图片 4.可以通过本地相册的二维码进行解码 1.下载三个插件 下载vue-qr&#xff0c;用于生成二维码 npm install vue-qr 下载vue-jimp并指定版本号&#xff0c;最新版不行&#xff0c;实…

Linux中yum、dnf、rpm

yum 1、看是否安装了某些东西 yum list all | grep php

一篇文章带你从入门都入土 Kafka 消息中间件(原理+代码)

目录 一、Kafka定义 二、消息队列 三、Kafka基础架构图 四、安装Kafka 4.1 为每台服务器下载Kafka并解压 4.2 查看目录结构 4.3 为每台服务器修改配置文件server.properties 4.4 为每台服务器配置Kafka环境变量 4.5 启动zookeeper集群 4.6 启动Kafka集群 4.7 关闭Ka…

IDEA初次连接Redis配置

解决IDEA报错代码&#xff1a;redis.clients.jedis.exceptions.JedisConnectionException: Failed connecting to host 192.168.127.185:6379 第一步、引入jedis依赖 <!--引入jedis依赖--> <dependencies><dependency><groupId>redis.clients</gr…

天数智芯通用GPU产品天垓100与飞桨完成III级兼容性测试,加速人工智能产业生态建设

近日&#xff0c;上海天数智芯半导体有限公司&#xff08;以下简称“天数智芯”&#xff09;通用 GPU 产品天垓 100 与飞桨已完成 III 级兼容性测试。测试结果显示&#xff0c;双方兼容性表现良好&#xff0c;整体运行稳定。这是天数智芯加入“飞桨硬件生态共创计划 ”后的阶段…

Tensor core原理

什么是Tensorcore Tensor core是nvidia底层执行运算的硬件单元&#xff0c;不同于nvidia以往的cuda core(全浮点型&#xff09;&#xff0c;Tensor core是近几年推出来的、混合精度的、将累加和累乘放在一起的计算硬件&#xff1b; 什么是混合精度 混合精度指的是在输入、输…

电脑出现0xC1900101错误怎么办?

在更新或安装Windows操作系统时&#xff0c;有时系统会提示出现了0xC1900101错误。这个错误的出现通常是源于与驱动程序相关的错误所致。那么当电脑出现0xC1900101错误时该怎么办呢&#xff1f; 为什么会出现错误代码0xC1900101&#xff1f; 通常情况下&#xff0c;有以下几个…

Java重点:反射机制的使用

目录 一、概念 二、类类 1、类类的获取方式 1&#xff09;类名.Class 2&#xff09;对象.getClass() 3&#xff09;Class.forName() 三、反射实例化 1、调用一个公有的无参构造方法 2、调用一个公有的一个参构造方法 3、调用一个公有的两个参构造方法 4、调用一个私有…

gitee(码云)如何生成并添加公钥

一&#xff0c;简介 在使用Gitee的时候&#xff0c;公钥是必须的&#xff0c;无论是克隆还是上传。本文主要介绍如何本地生成和添加公钥到服务器。供参考。 二&#xff0c;步骤介绍 2.1 本地生成公钥 打开git bash 输入以下代码回车三次&#xff1a; # 替换为你自己的邮箱…

opencv特征检测 HOG特征算法

1 HOG特征简介 Hog 算法的工作原理是创建图像中梯度方向分布的柱状图&#xff0c;然后以一种非常特殊的方式对其进行归一化。这种特殊的归一化使得Hog 能够有效地检测物体的边缘&#xff0c;即使在对比度很低的情况下也是如此。这些标准化的柱状图被放在一个特征向量&#xff…

51单片机的数字时钟系统【含仿真+程序+报告】

51单片机的数字时钟系统【含仿真程序报告】 1、 系统组成2、功能概述3、仿真4、程序代码5、报告6、资源链接 1、 系统组成 该系统由AT89C51单片机DS1302时钟模块按键模块DS18B20LCD显示模块构成。 2、功能概述 可显示实时的日期 包括 年-月-日 时分秒 星期 农历时间DS18B20室…

将图像2D转换为3D--LeiaPix Converter

LeiaPix Converter是一款免费的在线图像处理工具&#xff0c;可帮助用户将2D图像实时转换为精美的3D光场图像。 它使用由Leia开发的专有算法&#xff0c;为照片、插画和艺术作品等2D图像添加深度和立体感&#xff0c;目前是完全免费的。 LeiaPix Converter 的特点 多格式转换…

安全多方计算、联邦学习和可信执行环境

目录 隐私计算的三大技术流派&#xff1a;联邦学习、安全多方计算、可信计算 隐私计算的三大技术流派&#xff1a;联邦学习、安全多方计算、可信计算 1.多方安全计算&#xff0c;由姚期智院士于1982年首次提出&#xff0c;通过设计特殊的加密算法和协议&#xff0c;在无可信第…

Java 已知文件路径参数,用两种方法获取文件名

一、先获取带扩展名的fileName String filePath "D:\\manage\\uploadFile\\2023-06-28283\\初测.xlsx"; File file new File(filePath); // 或者 Path path Paths.get(filePath);String fileName1 file.getName(); System.out.println(fileName1);Path fileName…

Jmeter线程组配置

目录 前言&#xff1a; 一、线程组配置字段说明 二、线程组配置示例 前言&#xff1a; JMeter是一款开源的压力测试工具&#xff0c;被广泛应用于测试Web应用程序的性能和负载能力。其中线程组是JMeter中最基本、最重要的功能之一。线程组用于模拟多个并发用户对目标应用程…