The 2024 ICPC Kunming Invitational Contest F. Collect the Coins(二分)

在知乎内查看

题目

img

思路来源

官方题解

题解

一旦某个速度v满足,那么大于速度v的都满足,所以可以被二分,但是二分的check不好想,卡住了

最后去看了题解,其实维护的是,一个机器人在目标点收集硬币时,另一个机器人可能在的位置的范围

这个范围是一个连续的区间,并且在后面的变化过程中,也仍然会是连续的区间

所以,按时间顺序增序,

一开始,令其中一个机器人站在第一枚硬币上,那么另一个机器人的初始范围是 [ 1 , 1 0 9 ] [1,10^9] [1,109]

往后都维护这一个端点和一个区间

对于一枚新来的硬币,判断两个机器人是否可以接住这枚硬币,有四种情况:

  1. 如果端点所在的机器人能接住,而区间所在的机器人接不住,令端点所在的机器人去接,区间机器人只能往在这段时间往左右走,扩大活动范围

  2. 如果端点所在的机器人接不住,而区间所在的机器人能接住,令区间所在的机器人去接,并变成一个端点,原来端点所在的机器人在这段时间可以往左右走,扩大活动范围,变成一个区间

  3. 如果两个都能接住,那么谁去接都可以,实际就是1、2两种情况的并,然后发现1、2两个区间是有交的,那么他们的并集仍然是一个区间,所以还是维护一个端点和一个区间

  4. 如果都接不住,无解

事实上,只要同一秒不存在3个不同位置的机器人的话,总会是有解的

不过二分也统一了这种情况,v 大于 1 0 9 10^9 109 时认为没解就好了

代码

#include<bits/stdc++.h>
#include<iostream>
#include<cstdio>
#include<vector>
#include<queue>
#include<map>
#include<set>
using namespace std;
#define rep(i,a,b) for(int i=(a);i<=(b);++i)
#define per(i,a,b) for(int i=(a);i>=(b);--i)
typedef long long ll;
typedef double db;
typedef pair<ll,ll> P;
#define fi first
#define se second
#define pb push_back
#define dbg(x) cerr<<(#x)<<":"<<x<<" ";
#define dbg2(x) cerr<<(#x)<<":"<<x<<endl;
#define SZ(a) (int)(a.size())
#define sci(a) scanf("%d",&(a))
#define pt(a) printf("%d",a);
#define pte(a) printf("%d\n",a)
#define ptlle(a) printf("%lld\n",a)
#define debug(...) fprintf(stderr, __VA_ARGS__)
const int N=1e6+10;
const ll INF=1e9;
int t,n,c,x[N];
P a[N];
bool can(P x,P y,ll v){return abs(x.se-y.se)<=v*abs(x.fi-y.fi);
}
bool ok(ll v){int p=1;ll l=1,r=INF;rep(i,2,n){ll T=a[i].fi-a[p].fi,d=T*v;bool x=can(a[i],a[p],v),y=(l-d<=a[i].se && a[i].se<=r+d);if(x && y){l=min(l-d,a[p].se-d);r=max(r+d,a[p].se+d);}else if(x){l=l-d;r=r+d;}else if(y){l=a[p].se-d;r=a[p].se+d;}else{return 0;}p=i;l=max(1ll,l);r=min(INF,r);}return 1;
}
ll sol(){sci(n);rep(i,1,n){scanf("%lld%lld",&a[i].fi,&a[i].se);}ll l=0,r=INF;while(l<=r){ll mid=(l+r)/2;if(ok(mid))r=mid-1;else l=mid+1;}if(l>INF)return -1;return l;
}
int main(){sci(t);while(t--){ptlle(sol());}return 0;
}

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

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

相关文章

UGUI(三大现成UI控件)

Rawimage 可以是任意类型的图&#xff0c;所以这里的泛型就更宽泛&#xff0c;不止sprite 相比Image唯二的不同 uvrect有点像平铺 Text suddenly come to a Free island. best fit开启后会有范围选择 Image image 组件是挂在RectTransform的ui下的&#xff0c;换句话说&…

windows C++-创建数据流代理(二)

完整的数据流演示 下图显示了 dataflow_agent 类的完整数据流网络&#xff1a; 由于 run 方法是在一个单独的线程上调用的&#xff0c;因此在完全连接网络之前&#xff0c;其他线程可以将消息发送到网络。 _source 数据成员是一个 unbounded_buffer 对象&#xff0c;用于缓冲…

整理/删除重复文件

文件分类 #!/bin/bash if [ "$#" -ne 1 ]; thenecho "use: $0 <download_url>"exit 1 fi TARGET_DIR"$1" mkdir -p "$TARGET_DIR/jpg" mkdir -p "$TARGET_DIR/mp4" for img in "$TARGET_DIR"/*.jpg; doif…

k8s 中的 PV 的动态供给

目录 1 存储类 Storageclass 介绍 1.1 StorageClass 说明 1.2 StorageClass 的属性 2 存储分配器 NFS Client Provisioner 2.1 官网存储分配器的部署介绍 2.2 实现动态创建 PV 模版清单文件的介绍 2.2.1 Storageclass 存储类的模版 2.2.2 创建 Provisioner 制备器的模版 2.2.3…

ctf.bugku - POST

题目来源 &#xff1a;POST - Bugku CTF 访问请求&#xff0c;返回如下信息&#xff1b; 从这里可以得到信息&#xff1b;想要得到flag &#xff0c;需要发送post请求&#xff0c;并且请求带有what参数&#xff0c;参数值为flag 构造消息体&#xff1b; burpsuite中&#x…

连续点击三次用户

有用户点击日志记录表 t2_click_log&#xff0c;包含user_id(用户ID),click_time(点击时间)&#xff0c;请查询出连续点击三次的用户数&#xff0c; 连续点击三次&#xff1a;指点击记录中同一用户连续点击&#xff0c;中间无其他用户点击&#xff1b; CREATE TABLE t2_click…

仿小米的Disucz模板

整套模板是忽悠兄原创设计开发&#xff0c;这是一款简约大气的模板&#xff0c;保留Discuz预留功能&#xff0c; 必须一键式配置完成&#xff0c;使用插件配置到位&#xff0c;专业的网站肯定不使用DIY啦&#xff0c;二次开发了大部分功能&#xff0c; 更强大&#xff0c;别人…

微信小程序开发-配置文件详解

文章目录 一&#xff0c;小程序创建的配置文件介绍二&#xff0c;配置文件-全局配置-pages 配置作用&#xff1a;注意事项&#xff1a;示例&#xff1a; 三&#xff0c;配置文件-全局配置-window 配置示例&#xff1a; 四&#xff0c;配置文件-全局配置-tabbar 配置核心作用&am…

C++笔记之原子操作

C++笔记之原子操作 code review! 文章目录 C++笔记之原子操作1.初始化2.赋值3.取值4.赋给另一个原子类型5.`exchange`6.`compare_exchange_weak` 和 `compare_exchange_strong`使用场景7.注意事项在 C++ 中,原子类型提供了对共享变量的无锁操作,确保多线程环境下的安全。以下…

Linux搭建Hadoop集群(详细步骤)

前言 Hadoop是一个由Apache基金会所开发的分布式系统基础架构。用户可以在不了解分布式底层细节的情况下&#xff0c;开发分布式程序。充分利用集群的威力进行高速运算和存储。 说白了就是实现一个任务可以在多个电脑上计算的过程。 一&#xff1a;准备工具 1.1 VMware 1.2L…

免费高可用软件

高可用软件是指那些能够提供高可用性、高可靠性的软件&#xff0c;它们在各种应用场景下都能确保系统的稳定运行。以下是四款免费的高可用软件&#xff0c;它们在不同领域都表现出色&#xff0c;能够满足各种高可用性需求。 一、PanguHA PanguHA是一款专为Windows平台设计的双…

计算机的错误计算(一百一十六)

摘要 计算机的错误计算&#xff08;一百一十&#xff09;分析了&#xff08;二&#xff09;中例1循环迭代错误计算的原因。应读者建议&#xff0c;本节将用错数讨论其例2的错误计算原因。 例1. 已知 计算 在 的错数&#xff0c;并用实例分析计算过程中的错误数字数量。…

设计模式之适配器模式(Adapter)

一、适配器模式介绍 适配器模式(adapter pattern )的原始定义是&#xff1a;将类的接口转换为客户期望的另一个接口&#xff0c; 适配器可以让不兼容的两个类一起协同工作。 适配器模式是用来做适配&#xff0c;它将不兼容的接口转换为可兼容的接口&#xff0c;让原本由于接口…

2024Java最新面试题总结(针对于一些小厂、中厂)

这是根据个人面试经历总结出来的一些经验希望可以帮助到有需要的人。 面试的时候&#xff0c;会先让你进行自我介绍&#xff0c;这个大家准备一两分钟的面试稿就可以。然后就是正式面试&#xff0c;面试官一般是两个人以上&#xff0c;开始&#xff0c;面试官会先提问一些基本…

GRASP七大基本原则+纯虚构防变异

问题引出 软件开发过程中&#xff0c;需要设计大量的类&#xff0c;使他们交互以实现特定的功能性需求。但是不同的设计方式&#xff0c;对程序的非功能性需求&#xff08;可扩展性&#xff0c;稳定性&#xff0c;可维护性等&#xff09;的实现程度则完全不同。 有没有一种统一…

C++核心编程和桌面应用开发 第八天(继承)

目录 1.继承 1.1继承语法 1.2继承方式 1.3继承中的对象模型 1.4继承中的构造和析构 1.5继承中的同名成员处理 1.5.1同名属性处理 1.5.2同名成员函数处理 1.6继承中的同名静态成员处理 1.6.1同名静态成员属性处理 1.6.2同名静态成员函数处理 1.7多继承 1.继承 1.1继…

『网络游戏』自适应制作登录UI【01】

首先创建项目 修改场景名字为SceneLogin 创建一个Plane面板 - 将摄像机照射Plane 新建游戏启动场景GameRoot 新建空节点重命名为GameRoot 在子级下创建Canvas 拖拽EventSystem至子级 在Canvas子级下创建空节点重命名为LoginWnd - 即登录窗口 创建公告按钮 创建字体文本 创建输入…

数据结构——栈与队列的实现(全码)

一 栈的概念 栈是一种特殊的线性表&#xff0c;栈内数据遵循先进后出(LIFO)的原则&#xff0c;对于栈&#xff0c;只能在同一侧进行入栈和出栈操作。 入栈操作和出栈操作是在栈的同一侧进行的&#xff0c;如图示&#xff1a; 对于栈这种数据类型&#xff0c;我们可以采用链表或…

GSLAM——一个通用的SLAM架构和基准

GSLAM: A General SLAM Framework and Benchmark 开源地址 摘要&#xff1a; SLAM技术最近取得了许多成功&#xff0c;并吸引了高科技公司的关注。然而&#xff0c;如何同一现有或新兴算法的界面&#xff0c;一级有效地进行关于速度、稳健性和可移植性的基准测试仍然是问题。本…

数据库-分库分表

什么是分库分表 分库分表是一种数据库优化策略。 目的&#xff1a;为了解决由于单一的库表数据量过大而导致数据库性能降低的问题 分库&#xff1a;将原来独立的数据库拆分成若干数据库组成 分表&#xff1a;将原来的大表(存储近千万数据的表)拆分成若干个小表 什么时候考虑分…