P11232 [CSP-S 2024] 超速检测

P11232 [CSP-S 2024] 超速检测

难度:普及+/提高

考点:二分、贪心

题意

题意较长,没有题目大意,否则你也大意。

  • 主干道长度为 L L L,有 n n n 辆车,看做左端点为 0 0 0,第 i i i 辆距离左端点处 d i d_i di 处驶入,初速度为 v 0 i v_{0_{i}} v0i,加速度为 a i a_i ai,当瞬间速度为 0 0 0 / 到达右端点 L L L 时驶离主干道。

  • m m m 个测试仪,第 j j j 个测试仪位于右端点 P j P_j Pj 处,每个测试仪可以启动/关闭。某辆车如果在启动的测速仪上瞬间速度超过了限速 V V V,则说明超速了,注意起点和终点都有可能会有测速仪,(有可能驶入主干道就超速了)。

题目所求

第一问:如果 全部测速仪启动 n n n 辆车中会有多少辆车超速了。

第二问:如果想关闭一部分测试仪,且 不漏掉记录超速的车辆情况下,最多可以关闭多少个测速仪。

贴心的准备了加速度相关的公式(虽然只有一个有用);

分析

Subtask 1、2 n , m ≤ 20 n,m \le 20 n,m20

​ 暴力枚举,每个测速仪开和关的状态,共 2 m 2^m 2m 种选择。再用 m × n m \times n m×n 来检查答案,但 2 20 × n × m ≤ 4 e 8 2^{20} \times n \times m \le 4e8 220×n×m4e8。尝试将 n × m n \times m n×m 优化到 O ( n ) O(n) O(n)

在这里插入图片描述

分类讨论

其中 p j p_j pj 表示车 i i i 在主干道上「首个」测速仪的位置, p m p_m pm 表示主干道最后一个测速仪的位置。

  • 匀速:最大速度 [ p j , p m ] [p_j, p_m] [pj,pm] 一样,从头到尾速度不变,所以判断区间内任意一个测速仪都可以。
  • 加速:最大速度在测速仪 p m p_m pm 位置,由于是匀加速运动,则整段路中最后一个测速仪时速度值最大,如果没有超速,那么主干道上都没超速。
  • 减速:最大速度在测速仪 p j p_j pj 位置,由于是匀减速运动,则整段路中首个遇到的测速仪速度值最大。

通过二分来加速查找 p j p_j pj 「首个」测速仪的位置。

int j = std::lower_bound( p.begin(), p.end(), d[i] ) - p.begin();

时间复杂度优化到 O ( n l o g m ) ∗ 2 m O(nlogm)*2^{m} O(nlogm)2m 20 p t s 20pts 20pts 到手。

Subtask 3、4:性质 A A A a i = 0 a_i=0 ai=0(匀速运动), 20 p t s 20 pts 20pts

​ 非常 e a s y easy easy,直接判断 p j ∼ p m p_j \sim p_m pjpm 其中一个测速仪即可,不妨选择 p m p_m pm,如果 p m ≥ d i p_m \ge d_i pmdi && v i > V v_i > V vi>V。说明车辆 i i i 在整段路都超速了,答案就是 m − j + 1 m-j+1 mj+1 测速仪。

正解( 100 p t s 100pts 100pts ):包含 性质 B 、 C B、C BC

​ 对于上一个问题进行深入分析:什么样的测速仪能检测车 i i i 超速。

在这里插入图片描述

不妨设 f i f_i fi:表示车 i i i 进入主干道「首个」测速仪的下标。

  • 匀速, [ f i , m ] [f_i,m] [fi,m],所有碰到的测速仪都可以检测到。
  • 加速, [ f i , m ] [f_i,m] [fi,m] 的后缀,如上图,匀加速运动,相当于一整段主干道速度都在提升,有可能是加速一段之后「瞬时速度」大于 V V V 碰到首个摄像头 P k 1 P_{k1} Pk1,由于 P k 1 ≥ f i P_{k1} \ge f_i Pk1fi 故这一段肯定属于 [ f i , m ] [f_i,m] [fi,m] 的「后缀」,实际可以表示为 [ p k 1 , m ] [p_{k1},m] [pk1,m]
  • 减速, [ f i , m ] [f_i,m] [fi,m] 的前缀,如上图,与加速相反,有可能一开始已经在超速,经过一段时间的减速后「瞬时速度」小于 V V V 碰到首个摄像头 P k 2 Pk_2 Pk2,由于 P k 2 ≤ m P_{k2} \le m Pk2m 故这一段肯定属于 [ f i , m ] [f_i,m] [fi,m] 的「前缀」,实际可以表示为 [ f i , p k 2 ] [f_i,p_{k2}] [fi,pk2]

可以发现 符合要求 的是 连续的一段区间 [ f i , m ] [f_i,m] [fi,m],(符合要求):拍摄到超速测速仪,也好求**(二分)**求「前缀 / 后缀」。
{ 前缀,最后看到减速后不超速的点 后缀,最后看到加速后超速的点 \left\{ \begin{array}{lc} 前缀,最后看到减速后不超速的点\\ 后缀,最后看到加速后超速的点\\ \end{array} \right. {前缀,最后看到减速后不超速的点后缀,最后看到加速后超速的点
二分的细节:check i i i 车走 j j j 测速仪有无超速

可以发现题目中给了几个公式,但实际上有用的只有一个:瞬时速度: v 0 2 + 2 × a × s \sqrt{ v_0^2 + 2 \times a \times s } v02+2×a×s

二分就是 check 每辆车 i i i 在(初始速度为 V 0 V_0 V0,距离起点为 d i d_i di,加速度为 a i a_i ai)的瞬时速度: V 0 2 + 2 × a × ( p j − d i ) > V \sqrt{ V_0^2 + 2 \times a \times( p_j-d_i ) } > V V02+2×a×(pjdi) >V

根号会出现误差,最直接的办法就是想办法出掉精度丢失上带来的误差,直接两边平方 V 0 2 + 2 × a × ( p j − d i ) > V 2 V_0^2 + 2 \times a \times (p_j-d_i) > V^2 V02+2×a×(pjdi)>V2

还要计算一下答案是否会超出 int 1 0 6 + 2 ∗ 1 0 9 ≤ 2147483647 ( i n t ) 10^6 + 2*10^9 \le 2147483647(int) 106+21092147483647(int)

在这里插入图片描述

(如上图所示,答案就是一段一段连续的区间,代表某辆车被检测到超速的测速仪区间)

1 1 1:区间的个数(超速车的数量)。

2 2 2:保留若干个点,便得每个区间至少有一个点。

第二个问题就很眼熟是吧(入门贪心:区间选点问题?),我们可以用(贪心) → \rightarrow (区间的右端点排序),如下图。

在这里插入图片描述

作为 OI 教练一般不 刻意 压行,应该 代码分块展示,会让 读者/学生 思路更加清晰。

参考代码

#include <bits/stdc++.h>
#define ll long longconst int N = 1e5 + 10;
int n, m, L, V, d[N], v[N], a[N];
std::vector<int> p; // 寄存测速仪
struct Seg
{int l, r;                    // 记录车 i 会被测速仪,检测到超速的区间 [l,r]bool operator<(const Seg &a) // 贪心 ::: 右端点排序{return r < a.r;}
};
std::vector<Seg> seg;// 计算瞬间速度
ll speed(ll v, ll a, ll s)
{return v * v + 2 * a * s; // 题目已经给出式子
}void handler(int d, int v, int a)
{// first 表示进入主干道后第一个碰到的测速仪(下标)int first = std::lower_bound(p.begin(), p.end(), d) - p.begin();// 进入主干道 ::: 没有遇到测速仪,跳过if (first >= m)return;// 匀速 ::: 那一开始不超速意味着永远不会超速if (a == 0){if (v > V)seg.push_back({first, m - 1});return;}// 分类二分int l = first, r = m - 1, ans = -1, mid;// 减速,找到「最后一个」检测到超速的测速仪if (a < 0){while (l <= r){mid = l + r >> 1;if (speed(v, a, p[mid] - d) > V * V)ans = mid, l = mid + 1;elser = mid - 1;}if (ans != -1)seg.push_back({first, ans});return;}// 加速,找到「首个」能检测到加速的测速仪if (a > 0){while (l <= r){mid = l + r >> 1;if (speed(v, a, p[mid] - d) > V * V)ans = mid, r = mid - 1;elsel = mid + 1;}if (ans != -1)seg.push_back({ans, m - 1});}
}void solve()
{p.clear(); // T 组数组记得初始化seg.clear();std::cin >> n >> m >> L >> V;for (int i = 1; i <= n; i++)std::cin >> d[i] >> v[i] >> a[i]; // 起点, 初始速度, 加速度for (int i = 1, x; i <= m; i++)std::cin >> x, p.push_back(x); // pi 测试仪的位置for (int i = 1; i <= n; i++) // 处理出 ::: 每辆车 i 的测速仪超速的区间handler(d[i], v[i], a[i]);// 贪心 ::: 区间覆盖问题啦!sort(seg.begin(), seg.end());int last = -1, ans = 0;for (auto it : seg)if (last < p[it.l]) // 贪心的每次 ::: 选择不重合区间中的右端点last = p[it.r], ans++;std::cout << (int)seg.size() << " " << m - ans << "\n";
}int main()
{std::ios::sync_with_stdio(false), std::cin.tie(nullptr);int T;std::cin >> T;while (T--)solve();return 0;
}

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

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

相关文章

JSP九大内置对象和四大作用域

get和post区别&#xff1a; 比较项 get post 缓存 可以 不可以 收藏为书签 可以 不可以 数据长度 有限制&#xff08;URL 的最大长度是 2048 个字符&#xff09; 无限制 编码类型 application/x-www-form-urlencoded application/x-www-form-urlencoded 或 multi…

【java batik_使用BATIK解析SVG生成PNG图片】

矢量图的介绍及应用场景 矢量图是什么意思&#xff1f; 矢量图&#xff0c;也称为向量图&#xff0c;英文名字是Vector graphics。 矢量图是一种基于矢量的图形&#xff0c;由一系列的线段和曲线组成。由数学公式和算法生成的。这意味着矢量图可以在任何分辨率下清晰地显示&…

针对物联网边缘设备基于EIT的手部手势识别的1D CNN效率增强的组合模型压缩方法

论文标题&#xff1a;Combinative Model Compression Approach for Enhancing 1D CNN Efficiency for EIT-based Hand Gesture Recognition on IoT Edge Devices 中文标题&#xff1a;针对物联网边缘设备基于EIT的手部手势识别的1D CNN效率增强的组合模型压缩方法 作者信息&a…

0.STM32F1移植到F0的各种经验总结

1.结构体的声明需放在函数的最前面 源代码&#xff1a; /*开启时钟*/RCC_APB2PeriphClockCmd(RCC_APB2Periph_USART1, ENABLE); //开启USART1的时钟RCC_APB2PeriphClockCmd(RCC_APB2Periph_GPIOA, ENABLE); //开启GPIOA的时钟/*GPIO初始化*/GPIO_InitTypeDef GPIO_InitStructu…

【AIGC】ChatGPT提示词Prompt高效编写技巧:逆向拆解OpenAI官方提示词

博客主页&#xff1a; [小ᶻZ࿆] 本文专栏: AIGC | ChatGPT 文章目录 &#x1f4af;前言&#x1f4af;OpenAI官方提示词的介绍OpenAI官方提示词的结构与组成如何通过分析提示词找到其核心组件 &#x1f4af;OpenAI官方提示词分析案例一&#xff1a;制定教学计划案例二&…

Leetcode 62. 不同路径 动态规划+空间优化

原题链接&#xff1a;Leetcode 62. 不同路径 二维数组&#xff1a; class Solution { public:int uniquePaths(int m, int n) {int res 0;int box[m][n];for (int i 0; i < m; i) {box[i][0] 1;}for (int j 0; j < n; j) {box[0][j] 1;}for (int i 1; i < m;…

app的登录破解 frida jadx

今天收到了一个APP让我研究一下登录 登录已经研究完成 下面则是我的整体思路 为了安全考虑这个app我就不说是那个了 我就说整体的思路 仅供交流学习 严谨非法使用开始进行抓包 手机使用代理连接charles 之后开始点击app登录 进行抓包下面则是我抓到的包 抓包之后j进行改包 也…

【IEEE/CCF-C类】1区顶刊变水刊?发文量暴涨1600+,光速审稿,圆你顶刊梦!

&#x1f525; &#x1f525; &#x1f525; &#x1f525; 本期小编解析的是一本由IEEE旗下多个学会联合出版的计算机领域的TOP期刊《IEEE Internet of Things Journal》&#xff0c;该期刊自2014年创刊&#xff0c;专注于物联网&#xff08;IoT&#xff09;领域的研究…

django高校学生信息管理系统-计算机毕业设计源码02553

django高校学生信息管理系统 摘 要 本研究旨在设计和实现基于Django框架的高校学生信息管理系统&#xff0c;涵盖了系统用户、学生信息管理、教师信息管理、课程分类管理、开课信息管理、选课信息管理、课表信息管理、成绩信息管理、系统管理、网站公告管理和校园资讯等多个功能…

特殊矩阵的压缩存储

一维数组的存储结构 ElemType arr[10]; 各数组元素大小相同&#xff0c;且物理上连续存放。 数组元素a[i]的存放地址 LOC i * sizeof(ElemType)。&#xff08;LOC为起始地址&#xff09; 二维数组的存储结构 ElemType b[2][4];二维数组也具有随机存取的特性&#xff08;需…

中立性DEA交叉效率评价方法

今天推出中立性DEA模型的计算工具 参考文献&#xff1a;《中立性DEA交叉效率评价方法》袁剑波&#xff0c;吴立辉&#xff0c;魏思 中立性DEA交叉效率评价方法 在数据包络分析&#xff08;DEA&#xff09;对决策单元效率评价的方法中&#xff0c;对抗性DEA交叉效率方法把所有…

【Visual Studio】解决 CC++ 控制台程序 printf 函数输出中文和换行符显示异常

问题描述 C&C 控制台程序 printf 函数输出中文和换行符 \n 显示异常。 #include <stdio.h>int main() {int choice;printf("菜单:\n");printf("1. 选项一\n");printf("2. 选项二\n");printf("3. 选项三\n");printf("…

【dvwa靶场:XSS系列】XSS (Stored)低-中-高级别,通关啦

更改name的文本数量限制大小&#xff0c; 其他我们只在name中进行操作 【除了低级可以在message中进行操作】 一、低级low <script>alert("假客套")</script> 二、中级middle 过滤了小写&#xff0c;咱们可以大写 <Script>alert("假客套…

【Linux】深入理解进程控制:从创建到终止和进程等待

文章目录 进程创建fork函数如何用fork函数创建子进程写实拷贝 进程终止错误信息exit_exit 进程等待waitwaitpid 总结 进程创建 fork函数 fork 函数是 Unix/Linux 系统中用于创建新进程的系统调用。调用 fork 后&#xff0c;当前进程&#xff08;父进程&#xff09;会被复制&a…

【java】对象的内存存储

目录 对象在内存中的分配设计到的内存结构(理论)类中对象的内存解析创建类的一个对象&#xff0c;属性赋值创建类的多个对象&#xff0c;属性赋值 对象在内存中的分配设计到的内存结构(理论) 栈&#xff1a;方法内定义的变量&#xff0c;存储在栈中 堆&#xff1a;new出来的结…

【wrl2stl】WRL文件转STL文件-Python

之前有一篇博客写了Avizo自动化批量导出wrl文件&#xff1a;【Avizo&Python】离散颗粒的分割、网格化与单颗粒批量自动保存wrl文件_avizo python-CSDN博客 还有一篇写了wrl转为xyz格式文件&#xff1a; Wrl文件转XYZ文件-Python_python 打开wrl三维模型-CSDN博客 在这篇…

【Linux系统编程】第三十九弹---探索信号处理的奥秘:阻塞信号与sigset_t的深入剖析及实战

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】 目录 1、信号处理 2、阻塞信号 2.1、信号其他相关常见概念 2.2、在内核中的表示 2.3、sigset_t 2.4、信号集操作函数 3、完整…

零基础Apifox测试FastAPI接口入门

文章目录 一、FastAPI部分二、Apifox部分1、安装Apifox2、创建接口3、更改测试环境4、发送请求 一、FastAPI部分 python使用fastapi编写接口内容&#xff08;文件名&#xff1a;text.py&#xff09;&#xff1a; from fastapi import FastAPI import uvicornapp FastAPI()ap…

Linux终端退出程序后,TCP地址仍被占用

报错如下&#xff1a; Error on binding: Address already in use 这是一个正在运行的服务器&#xff0c;运行在linux的终端。上一次我使用CtrlZ退出这个程序&#xff0c;再次./my_server想运行这个程序时&#xff0c;出现这个报错。这是由两点原因&#xff1a; 1、守护进程或…

嵌入式通信协议:IIC简明学习笔记

IIC学习笔记 IIC特点 1.适合 小数据场合使用&#xff0c;传输距离短。 2.只能有一个主机。 3.标准IIC速度为100kHZ&#xff0c;高速IIC一般可达400kHZ以上。 4.SCL和SDA都需要接上拉电阻&#xff08;大小由速度和容性负载决定&#xff0c;一般在3.3k-10k之间&#xff09;。 5…