首页 > 其他分享 >CF1910G Pool Records记录

CF1910G Pool Records记录

时间:2023-12-27 23:56:11浏览次数:21  
标签:fun val vis Records 0L CF1910G ans var Pool

题目链接:https://codeforces.com/contest/1910/problem/G

题意简述

有两个运动员以未知的固定速度 \(v_1 \ne v_2\) 在一个长为 \(50\) 米的游泳池中游泳,一旦到边缘就立即掉头。现在有他们前 \(n\) 次相遇时间 \(t_i\)(递增,均为整数)的记录,问这个记录是否合法。\(n \le 2 \times 10^5\)。

题解

这题和之前一题 F 题有相当相似的背景,可以先去看看我对那一题的记录

现在回过头来看,这题其实是个比较简单的贪心,但可能与放的位置(前面的题还是比较耗时间的)、参赛分布(因为是 Kotlin Heroes 场)有关,被评到了 *2700 的高分。由于我被 E、F 卡了太久,赛时也就根本没有看这一题。

由中学物理知识可知,他们相遇的时间符合表达式 $\dfrac{2kl} {v_1-v_2} $ 或 \(\dfrac {2kl} {v_1 + v_2}\)(\(k \in {\mathbb N}^+\))。我们记 \(u = \dfrac{2l} {v_1-v_2}, v = \dfrac {2l} {v_1 + v_2}\),则任意一对 \(u \ne v\) 和 \(v_1 \ne v_2\) 一一对应。问题转化为如下形式:

  • 是否存在 \(u < v \in {\mathbb N^+}\),使 \(t\) 是 \(u\) 或 \(v\) 的倍数集合中的前 \(n\) 个数?

若存在这样的 \((u, v)\),容易得到如下结论:

  • \(u = t_1\);

  • 若 \(v\) 是 \(u\) 的倍数,\(t_i = i \cdot u\);否则,\(v\) 就是 \(t_i\) 中第一个不为 \(u\) 的倍数的数。

也就是说,在排除 \(\forall i, u | t_i\) 的特殊情况后,我们已经唯一确定了 \(u, v\) 的值。那么,我们就知道数组 \(t\) 中理应包含哪些值(\(i \cdot u, j \cdot v \le t_n\)),一遍检查即可确定答案。

实际上,通过维护当前期待的两个倍数,可以在一遍遍历中完成上面的所有操作。时间复杂度 \(O(n)\)。

代码

fun readInt() = readln().toInt()
fun readLongs() = readln().split(' ').map { it.toLong() }.toLongArray()

fun solve() {
    val n = readInt()
    val a = readLongs()
    var (x, y) = a[0] to 0L
    var (i, j) = 1L to 1L
    var ans = true
    for (t in a) {
        var vis = false
        if (t == i * x) {
            i++
            vis = true
        }
        if (t == j * y) {
            j++
            vis = true
        }
        if (!vis) {
            if (y != 0L || t % x == 0L) ans = false
            y = t
            j = 2
        }
    }
    if (y != 0L) {
        val mx = a.last()
        val (expI, expJ) = (mx / x to mx / y)
        ans = ans and (i == expI + 1) and (j == expJ + 1)
    }
    println(if (ans) "VALID" else "INVALID")
}

fun main() {
    val tc = readInt()
    repeat(tc) { solve() }
}

标签:fun,val,vis,Records,0L,CF1910G,ans,var,Pool
From: https://www.cnblogs.com/cpchenpi/p/17931681.html

相关文章

  • Apache Commons Pool的对象池技术
    第1章:引言咱们今天来聊聊一个在Java开发中超级实用,但又经常被忽视的技术——对象池技术。可能你们已经听说过“对象池”这个名词,但对它的具体作用和重要性还有些模糊。别急,小黑带你们一步步深入了解。想象一下,咱们的程序就像一个忙碌的餐厅,每次客人点餐都得现做一套餐具,吃完后......
  • ThreadPoolExecutor源码学习
    Java构建线程的方式集成Thread实现Runnable实现CallAble线程池方式Java提供了Executors创建(不推荐,不方便进行控制)推荐手动创建线程池ThreadPoolExecutor。ThreadPoolExecutor参数intcorePoolSize核心线程数intmaximumPoolSize最大线程数,最大减核心是非核心线程......
  • Java线程池ThreadPoolExecutor源码解析
    Java线程池ThreadPoolExecutor源码解析1.ThreadPoolExecutor的构造实现以jdk8为准,常说线程池有七大参数,通常而言,有四个参数是比较重要的publicThreadPoolExecutor(intcorePoolSize,intmaximumPoolSize,lon......
  • Netty源码学习9——从Timer到ScheduledThreadPoolExecutor到HashedWheelTimer
    系列文章目录和关于我一丶前言之前在学习netty源码的时候,经常看nettyhash时间轮(HashedWheelTimer)的出现,时间轮作为一种定时调度机制,在jdk中还存在Timer和ScheduledThreadPoolExecutor。那么为什么netty要重复造轮子昵,HashedWheelTimer又是如何实现的,解决了什么问题?这一篇将从T......
  • C语言全局变量的extern+typedef函数指针+uvm_queue/pool/config_db/resource_db/barri
    C语言全局变量的extern全局变量在不同的文件引用,需要加上extern,才能引用到。如果没有extern关键词,则认为是一个定义,而不是引用,引发同名冲突。函数也是一样。要在本文件引用其它文件的函数,需要增补extern关键字。而其它文件,声明和定义过该函数。typedef函数指针https://zhuan......
  • 无涯教程-PL/SQL - 记录(Records)
    在本章中,无涯教程将讨论PL/SQL中的记录(Records)。记录是一种数据结构,可以容纳不同种类的数据项。记录由不同的字段组成,类似于数据库表的一行。PL/SQL可以处理以下类型的记录-基于表的记录  (Table-basedrecords)基于游标的记录(Cursor-basedrecords)用户定义的记录(U......
  • Could not get a resource from the pool 异常定位和解决
    最近在服务中经常看到以下错误,进行下定位和问题解决分析:2023-12-0800:10:58.248WARN[terra-sr-server,a9006fd27ccb81d0,a9006fd27ccb81d0,false]52---[o-14009-exec-38]o.s.b.a.redis.RedisHealthIndicator:Redishealthcheckfailedorg.springframewor......
  • Executors.newFixedThreadPool(int nThreads)存在的缺陷
    一般来讲是不推荐直接使用JAVA提供的Executors类来初始化线程池,如果有需要可以自行通过ThreadPoolExecutor来封装进行初始化。可以用newFixedThreadPool(intnThreads)来简单分析下。看一下源代码不难发现,问题的原因在于此方法返回的ThreadPoolExecutor使用的阻塞队列是Linked......
  • genalloc/genpool 子系统 【ChatGPT】
    https://www.kernel.org/doc/html/v6.6/core-api/genalloc.htmlgenalloc/genpool子系统内核中有许多内存分配子系统,每个子系统都针对特定的需求。然而,有时内核开发人员需要为特定范围的特定用途内存实现新的分配器;通常这些内存位于设备的某个位置。该设备的驱动程序的作者当......
  • 无涯教程-Erlang - Records(记录)
    Erlang具有创建records记录函数,这些records记录由字段组成,例如,您可以定义一个personal records,其中包含2个字段,一个是id,另一个是name字段。然后,您可以在Erlang中创建此records记录的各种实例,以定义具有不同名称和ID的多个personal。创建记录使用record标识符创建,在此record......