只能说自己太菜了,真的完全想不到。

如果说单纯的想找到这个相撞的组合是十分困难的。所以全局的考虑一下,如果有两个车相撞,那么说明这两个车的相对位置发生了改变。而我们要找的肯定他超过与之最近的不同型号的左或右的车,因为如果他要超车,那么肯定是先超过第一个然后在第二个,那么我们的任务就变成了找到某个时刻第一次有两个不同型号的车的相对位置发生了改变。

那么我们就可以  二分答案   ,二分的标准即为时间。

我们可以先把每个车在它之前的第一个与他型号不同的车的编号与在他之后的第一个编号不同的记录在L,R数组里面,然后对于每一个t,验证在他左边的车是否晚于他出现,在他右边的车是否早于他出现。

其次对于找左右数组这里有一个巧法,这个更想不到,快哭了

    L[r[1].id]=-1,R[r[n].id]=-1;for(int i = 2; i <= n ; i++){if(r[i-1].p == r[i].p){L[r[i].id]=L[r[i-1].id];/如果型号相同,那他们两个的L数组相同即可}else{L[r[i].id]=r[i-1].id;/否则就等于他的下标}}for(int i = n-1; i >= 1; i--){if(r[i+1].p == r[i].p){R[r[i].id]=R[r[i+1].id];}else{R[r[i].id]=r[i+1].id;}}

然后就是check函数的选择

我们可以先把他们现在的位置按照大小排序,然后从前往后遍历,验证是否有他左边的车未出现,或者她右边的车出现了,但是这里可能有特殊情况,就是某个时刻他们到了同一个点,但是排序的话他们的相对位置并没有变。所以可以用一个vis存他是否出现,po数组存这个点的位置。

同时这里记录位置的数组po要开long long 或者用map存都可以,不然会爆

    for(int i = 1; i <= n ; i++){rr[i]=r[i];rr[i].x+=t*rr[i].v;}sort(rr+1,rr+1+n);for(int i = 1; i <= n ; i++){int pos1=L[rr[i].id],pos2=R[rr[i].id];if(pos1 != -1){/这样就不用考虑-1的情况了,因为考虑没有意义,他总是成立的if(!vis[pos1]){/如果压根不存在他们就说明超过了return true;}else{/如果在他之前,但他俩位置相同,还是超过了if(po[pos1] == rr[i].x)return true;}}if(pos2 != -1){if(vis[pos2])return true;}vis[rr[i].id]=1;po[rr[i].id]=rr[i].x;}

然后对于不成立的情况,我们其实只要好到他的最大可能值如果这样都没有相撞,那么之后就更不会相撞了。极限为两个不同型号的车,一个位于-1e9,速度为1,一个位于1e9速度为0,那么他们共需要2e9的时间,所以设为3e9是绰绰有余,我设的习惯是维护一个端点,这里如果当前时刻是可行的,那么说明答案要么是当前时刻,要么比当前时刻早(因为这道题让我们找到最长的安全时刻)那么最总输出的就是相撞时刻-1

​ll l=0,r=3e9+10;while(l<r){ll mid=r+l-1>>1;if(check(mid))r=mid;elsel=mid+1;}if(r>=3e9+10) printf("-1");else          printf("%d",r-1);​

所以总的复杂度就是n*log(n)*log(n)

最后附上完整代码

#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <map>using namespace std;
typedef long long ll;
const int maxn = 1e5+10;struct node{ll x,v,p,id;friend operator <(node x,node y){return x.x<y.x;}
}r[maxn],rr[maxn];
int n,m,a[maxn][2],L[maxn],R[maxn],vis[maxn],k1,k2;
map<int,ll>po;
bool check(ll t){memset(vis,0,sizeof vis);po.clear();for(int i = 1; i <= n ; i++){rr[i]=r[i];rr[i].x+=t*rr[i].v;}sort(rr+1,rr+1+n);for(int i = 1; i <= n ; i++){int pos1=L[rr[i].id],pos2=R[rr[i].id];if(pos1 != -1){if(!vis[pos1]){return true;}else{if(po[pos1] == rr[i].x)return true;}}if(pos2 != -1){if(vis[pos2])return true;}vis[rr[i].id]=1;po[rr[i].id]=rr[i].x;}return false;}
int main()
{scanf("%d %d",&n,&m);for(int i = 1; i <= n ; i++){scanf("%lld %lld %lld",&r[i].x,&r[i].v,&r[i].p);r[i].id=i;}sort(r+1,r+1+n);L[r[1].id]=-1,R[r[n].id]=-1;for(int i = 2; i <= n ; i++){if(r[i-1].p == r[i].p){L[r[i].id]=L[r[i-1].id];}else{L[r[i].id]=r[i-1].id;}}for(int i = n-1; i >= 1; i--){if(r[i+1].p == r[i].p){R[r[i].id]=R[r[i+1].id];}else{R[r[i].id]=r[i+1].id;}}if(m == 1){/这样可以直接判定不可能printf("-1");return 0;}ll l=0,r=3e9+10;while(l<r){ll mid=r+l-1>>1;if(check(mid))r=mid;elsel=mid+1;}if(r>=3e9+10) printf("-1");else          printf("%d",r-1);return 0;
}

2021上海省赛 H. 鸡哥的 AI 驾驶(二分答案)相关推荐

  1. 鸡哥的 AI 驾驶 (Gym - 103186H)

    题 鸡哥最近正在制作一款游戏<狭道赛车手X>,他为游戏中的车辆编写了一个自动驾驶AI,使得游戏中的车辆的车辆能够在将要撞到别的车辆时自动绕过对方,且不需要减速. 然而游戏上线后鸡哥突然发现 ...

  2. 西南科技大学2021届新生赛 H.小凡出数据(构造)

    LINK 首先把输入的距离对从小到大排个序 那么距离为1,21,21,2的可以直接连起来 考虑距离为333的怎么办,设u,vu,vu,v间的距离为333 可能有两种来源,一是由1+21+21+2组成, ...

  3. 2021CCPC上海省赛题解ABCDEGHIJK

    2021CCPC上海省赛题解ABCDEGHIJK A. 小 A 的点面论 题意 给定两相异的非零向量(x1,y1,z1),(x2,y2,z2)(0≤xi,yi,zi≤10)(x_1,y_1,z_1), ...

  4. 21上海省赛 F-鸡哥的限币令

    21上海省赛 F-鸡哥的限币令 n个点m条单向边的图中,边上有边权,要求选择一个边的集合使得每一个点有至少一条连入的边和一条连出的边,且这个集合的边权和最小.如果不能找到,输出-1:如果找到了,输出边 ...

  5. (每日一题)CF1139D Steps to One 2021年天梯赛 L3-3 可怜的简单题(期望,莫比乌斯反演,杜教筛)

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 一周连考三门,人都没了 Weblink 2021年天梯赛 L3-3 可怜的简单题 CF1139D Pr ...

  6. 2019 ACM - ICPC 上海网络赛 E. Counting Sequences II (指数型生成函数)

    繁凡出品的全新系列:解题报告系列 -- 超高质量算法题单,配套我写的超高质量题解和代码,题目难度不一定按照题号排序,我会在每道题后面加上题目难度指数(1∼51 \sim 51∼5),以模板题难度 11 ...

  7. 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it

    链接:https://www.nowcoder.com/acm/contest/163/F 来源:牛客网 2018 ACM 国际大学生程序设计竞赛上海大都会赛重现赛 F Color it 时间限制:C ...

  8. 上海区域赛Unlock the Cell Phone

    /* 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4026  题目来源:上海区域赛Unlock the Cell Phone 报告人:SpringWa ...

  9. 上海落户计算机水平毕业研究生,2021上海积分落户应届毕业生直接落户上海

    原标题:2021上海积分落户应届毕业生直接落户上海 --上海落户积分120分,不是研究生毕业就有100分吗?研究生毕业就有100分,正常读书年龄肯定很小就有30分了啊,不是直接就可以落户了吗?为什么大 ...

最新文章

  1. 在线作图|差异柱状图(组内)
  2. Bowtie下载安装
  3. 数据中心怎么建更科学
  4. 细说 Vue.js 3.2 关于响应式部分的优化
  5. 程序设计基础(c语言)复习大纲,《程序设计基础-C》复习大纲.doc
  6. OpenCV基本函数使用--Python
  7. java面试要点---ibatiS框架的使用方法介绍---随时更新
  8. xp系统的无线配置服务器,Windows XP系统下无线网卡配置及安装
  9. ubuntu20.04 安装Dukto
  10. 实战项目-小说网站开发过程中难点记录(1)
  11. 自动发片q机器人_寻片机器人(微信群自动回复工具)V2.6.853 正式版
  12. Pygame——AI重力四子棋
  13. ​机器如何“猜你喜欢”?深度学习模型在1688的应用实践...
  14. Win11热键冲突怎么解决?
  15. 企业微信每日给女友推送早安,5分钟快速部署,腾讯云部署版本,每日定时发送,天气,鸡汤,纪念日等信息,可自定义通知提醒名称,聊天界面可置顶,内容可查图片。
  16. CDN可以防护什么种类的攻击?
  17. android 录像抠取人像,snapseed抠图教程
  18. sqlserver数据库优化指南
  19. 愤怒的小鸟siki学院案例,添加瞄准预测轨迹<五>
  20. 基于C#(Visual Studio 2013)的AutoCAD2016二次开发(一)编程环境的搭建

热门文章

  1. MinGW安装与环境变量配置和Sublime Text 3搭建C++编译环境
  2. 2022年初级会计考试精选复习题及答案
  3. IT 妹子伤不起啊:看女生是如何拒绝屌丝的求爱的……
  4. 【小样本学习】近两年小样本学习取得重大进展了吗?
  5. 欧几里得距离(欧式距离)
  6. Chrome Manifest V3
  7. Busybox 安装
  8. 通过微软System center 2012 R2 构建私有云要点
  9. linux 编译mqtt静态库_Windows 编译 MQTT C++
  10. 常见android应用