P11232 [CSP-S 2024] 超速检测

news2024/11/24 7:57:25

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 long

const 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;
            else
                r = 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;
            else
                l = 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.coloradmin.cn/o/2229851.html

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

相关文章

使用GetX实现GetPage中间件

前言 GetX 中间件&#xff08;Middleware&#xff09;是 GetX 框架中的一种机制&#xff0c;用于在页面导航时对用户进行权限控制、数据预加载、页面访问条件设置等。通过使用中间件&#xff0c;可以有效地控制用户的访问流程&#xff0c;并在适当条件下引导用户到所需页面。 这…

JAVA:常见 JSON 库的技术详解

1、简述 在现代应用开发中&#xff0c;JSON&#xff08;JavaScript Object Notation&#xff09;已成为数据交换的标准格式。Java 提供了多种方式将对象转换为 JSON 或从 JSON 转换为对象&#xff0c;常见的库包括 Jackson、Gson 和 org.json。本文将介绍几种常用的 JSON 处理…

视频怎么去水印?7个视频去水印在线工具大比拼,宝藏工具推荐!

您是否正在寻找一款好用的视频去水印在线工具&#xff0c;却总是难以找到合适的去水印软件&#xff1f;别担心&#xff0c;今天在本文中小编将和大家分享一些去水印的小助手。很多人都觉得视频或图片上的水印十分烦人。如果您有着同样的烦恼&#xff0c;那么使用去水印工具将是…

如何一键更换ppt模板?掌握这2个ppt技巧快速搞定!

每当要制作ppt&#xff0c;很多人会第一时间去搜刮各种ppt模板&#xff0c;有时我们找到了一份貌似符合需求的模板&#xff0c;等到了ppt制作环节&#xff0c;才发现离我们的预期相距甚远&#xff0c;做到一半的ppt如何换模板呢&#xff1f; 想要在中途更换ppt模板&#xff0c;…

0基础入门linux文件系统

目录 文件系统简介 1. 文件系统类型 2. 文件系统结构 3. 文件系统的主要功能 4. 文件系统的使用 5. 文件系统的维护 6. 注意事项 简单举例 机械硬盘 物理结构介绍​编辑 CHS寻址 逻辑结构介绍 LBA寻址法 文件系统与磁盘管理 Boot Block Data block inode block…

2024年meme币走势分析:最后两个月的市场趋势与机会 #交易所#dapp#KOL社区合作

2024年即将步入尾声&#xff0c;meme币市场经历了显著的波动。对于加密市场来说&#xff0c;年底的走势尤为关键&#xff0c;尤其是meme币这种受市场情绪影响较大的加密资产。本文将从市场环境、宏观经济因素、投资者情绪、技术分析等方面分析meme币在2024年最后两个月的潜在走…

Cpp多态机制的深入理解(20)

文章目录 前言一、多态的概念二、多态的定义与实现两个必要条件虚函数虚函数的重写重写的三个例外override 和 final重载、重写(覆盖)、重定义(隐藏) 三、抽象类概念接口继承和实现继承 四、多态的原理虚表和虚表指针虚函数调用过程动态绑定与静态绑定 五、那...那单继承甚至多…

.net core 接口,动态接收各类型请求的参数

[HttpPost] public async Task<IActionResult> testpost([FromForm] object info) { //Postman工具测试结果&#xff1a; //FromBody,Postman的body只有rawjson时才进的来 //参数为空时&#xff0c;Body(form-data、x-www-form-urlencoded)解析到的数据也有所…

高清解压视频素材从哪儿下载?推荐5个高清推文素材资源网站

做抖音小说推文&#xff0c;哪里找爆款素材&#xff1f;作为一名从业多年的视频剪辑师&#xff0c;今天就来给大家揭秘可以下载爆款推文视频素材的网站&#xff0c;如果你也在苦苦找寻找&#xff0c;赶紧进来看看吧&#xff5e; 1. 稻虎网 首先是稻虎网&#xff0c;作为国内顶…

Python的全局锁GIL解析

Python的全局锁&#xff08;GIL&#xff09;是 CPython 解释器实现中的一个机制&#xff0c;用来确保任何时候只有一个线程执行 Python 字节码。这一机制存在于 CPython 中&#xff0c;主要是为了确保线程操作中的数据一致性&#xff0c;但也因此限制了多线程的并行执行效率。尤…

ELK的ElasticStack概念

目录 传送门前言一、ElasticStack是什么二、ElasticStack数据格式1、Elasticsearch的概述2、Elasticsearch核心概念&#xff08;1&#xff09;接近实时&#xff08;NRT&#xff09;&#xff08;2&#xff09;集群&#xff08;cluster&#xff09;&#xff08;3&#xff09;节点…

硅谷甄选(9)SKU模块

SKU模块 8.1 SKU静态 <template><el-card><el-table border style"margin: 10px 0px"><el-table-column type"index" label"序号" width"80px"></el-table-column><el-table-columnlabel"名称…

如何将ppt转换成word文档?8款ppt转word免费的软件大揭秘,值得收藏!

在日常办公中&#xff0c;将ppt转换成word文档的需求日益增长。这种需求源自多个方面&#xff0c;比如制作详尽的报告、创建课程讲义&#xff0c;或者将信息转化为可编辑的格式。作为一种普遍使用的演示工具&#xff0c;ppt在许多商业环境中扮演着重要角色。然而&#xff0c;随…

pandas——DataFrame

一、dataframe &#xff08;一&#xff09;创建dataframe file.csv Name,Age,City Alice,30,New York Bob,25,Los Angeles Charlie,35,Chicagoimport pandas as pd 1.使用字典创建DataFrame&#xff1a; 其中字典的键是列名&#xff0c;值是数据列表。print(1.使用字典创建D…

vxe-table v4.8+ 与 v3.10+ 虚拟滚动支持动态行高,虚拟渲染更快了

Vxe UI vue vxe-table v4.8 与 v3.10 解决了老版本虚拟滚动不支持动态行高的问题&#xff0c;重构了虚拟渲染&#xff0c;渲染性能大幅提升了&#xff0c;行高自适应和列宽拖动都支持&#xff0c;大幅降低虚拟渲染过程中的滚动白屏&#xff0c;大量数据列表滚动更加流畅。 自适…

关于武汉芯景科技有限公司的马达驱动芯片AT6237开发指南(兼容DRV8837)

一、芯片引脚介绍 1.芯片引脚 二、系统结构图 三、功能描述 逻辑功能

青出于“蓝”的合资第一新能源,“换壳”背后有门道

文/王俣祺 导语&#xff1a;千呼万唤始出来的新能源“马6”终于亮相了&#xff0c;这款马自达EZ-6本以为凭借马自达多年来在国内市场深耕的底蕴可以收获一片支持&#xff0c;但最近却深陷“换壳”风波。那么今天我们就一起看看&#xff0c;这款马自达EZ-6和被冠以“原型”的深蓝…

Github上的十大RAG(信息检索增强生成)框架

信息检索增强生成(Retrieval-Augmented Generation,简称RAG)是一种强大的技术,能够显著提升大型语言模型的性能。RAG框架巧妙地结合了基于检索的系统和生成模型的优势,可以生成更加准确、符合上下文、实时更新的响应。随着对先进人工智能解决方案需求的不断增长,GitHub上涌现出…

【小白学机器学习28】 统计学脉络+ 总体+ 随机抽样方法

目录 参考书&#xff0c;学习书 0 统计学知识大致脉络 1 个体---抽样---整体 1.1 关于个体---抽样---整体&#xff0c;这个三段式关系 1.2 要明白&#xff0c;自然界的整体/母体是不可能被全部认识的 1.2.1 不要较真&#xff0c;如果是人为定义的一个整体&#xff0c;是可…

5、片元着色器之基础光照模型:Phong模型和Blinn-Phong模型

1、什么是Phong光照模型&#xff1f; Phong模型就是在兰伯特模型的基础上增加了镜面反射光的计算。具体来说&#xff0c;兰伯特模型只考虑漫反射光&#xff0c;而Phong模型在此基础上引入了镜面反射光的概念&#xff0c;以模拟光线在光滑表面反射时产生的高光效果。镜面反射光的…