Codeforces Round 927 (Div. 3) G. Moving Platforms --- 题解 (非常好的题)

news2024/11/20 2:32:43

目录

Codeforces Round 927 (Div. 3) G. Moving Platforms:

原题链接:Problem - G - Codeforces

题目大意:

思路解析:

代码实现:


Codeforces Round 927 (Div. 3) G. Moving Platforms:

原题链接:Problem - G - Codeforces

题目大意:

        给你n个城市,m条道路,组成一个无向图,给你一个模数h,每个城市有一个初始价值为si,并且每个城市在每秒会有一个变化值li,当 (si+ t * li) mod h == (sj + t * lj) mod h时通道才会打开,问从第一个城市到最后一个城市最少需要多少时间,如果无法到达输出-1.

思路解析:

        给你n个城市,m条道路,组成一个无向图,问从第一个城市到最后一个城市最少需要多少时间这里很容易可以想到需要用到最短路,但是在跑最短路时我们怎么判断当前两个城市是否能够进行转移,或者转移需要等待多长时间,便成了主要难点。

        

        

代码实现:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String[] args) throws IOException {
        int T = input.nextInt();
        for (int o = 0; o < T; o++) {
            int n = input.nextInt();
            int m = input.nextInt();
            int H = input.nextInt();
            Vector<Integer> g[] = new Vector[n];
            for (int i = 0; i < n; i++) {
                g[i] = new Vector<>();
            }
            PriorityQueue<Node> nodes = new PriorityQueue<Node>(new Comparator<Node>() {
                @Override
                public int compare(Node o1, Node o2) {
                    if (o1.time > o2.time) return 1;
                    else if (o1.time == o2.time) return o1.x - o2.x;
                    return -1;
                }
            });
            int[] l = new int[n+1];
            long[] s = new long[n+1];
            for (int i = 0; i < n; i++) {
                l[i] = input.nextInt();
            }
            for (int i = 0; i < n; i++) {
                s[i] = input.nextInt();
            }
            for (int i = 0; i < m; i++) {
                int x = input.nextInt() - 1;
                int y = input.nextInt() - 1;
                g[x].add(y);
                g[y].add(x);
            }
            long[] dp = new long[n];
            Arrays.fill(dp, (long) 1e18);
            dp[0] = 0;
            nodes.add(new Node(0, dp[0]));
            while (!nodes.isEmpty()){
                Node cur = nodes.poll();
                int v = cur.x;
                long t = dp[v];
                if (t < cur.time) continue; // 因为他可能里面存放了多个 u,dp[u]的点,选择当时加入时dp[u]最小的那个进行遍历即可
                for (Integer u : g[v]) {
                    long a = (l[v] + (t % H) * s[v]) - (l[u] + (t % H) * s[u]);
                    a %= H;
                    if (a < 0) a += H;
                    long b = s[u] - s[v];
                    b %= H;
                    if (b < 0) b += H;
                    // a - bx = yH
                    long[] arr = eucl(b, H);
                    long dd = arr[0];
                    long x = arr[1];
                    // xb + yH = dd
                    if (a % dd != 0) continue;
                    x *= a / dd;
                    x %= (H / dd);
                    if (x < 0) x += H / dd;
                    long dt = x;
                    if (dp[v] + dt + 1 < dp[u]){
                        dp[u] = dp[v] + dt + 1;
                        nodes.add(new Node(u, dp[u]));
                    }
                }
            }
            if (dp[n - 1] == (long) 1e18) out.println(-1);
            else out.println(dp[n - 1]);
        }
        out.flush();
        out.close();
        br.close();
    }
    public static long[] eucl(long a, long b) { // 扩展欧几里得
        if (b == 0) {
            return new long[]{a, 1, 0}; //
        }
        long k = a / b;
        long[] arr = eucl(b, a - k * b);
        return new long[]{arr[0], arr[2], arr[1] - k * arr[2]};
    }
    public static class Node{
        int x;
        long time;
        public Node(int x, long time){
            this.x = x;
            this.time = time;
        }

    }


    static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));
    static Input input = new Input(System.in);
    static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

    static class Input {
        public BufferedReader reader;
        public StringTokenizer tokenizer;

        public Input(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream), 32768);
            tokenizer = null;
        }

        public String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }


        public int nextInt() {
            return Integer.parseInt(next());
        }
    }
}

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

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

相关文章

高刷电竞显示器 - HKC VG253KM

今天给大家分享一款高刷电竞显示器 - HKC VG253KM。 高刷电竞显示器 - HKC VG253KM源于雄鹰展翅翱翔的设计灵感&#xff0c;严格遵循黄金分割比例的蓝色点晴线条&#xff0c;加上雾面工艺及高低起伏错落有致的线条处理&#xff0c;在VG253KM的背部勾勒出宛若大鹏展翅的鹰翼图腾…

app自动化元素定位工具Weditor安装使用

之前用appium自带的appium Desktop inspector老是定位不到元素 如下 用另外工具 Weditor M1电脑 安装 pip3 install weditor 启动-自动打开端口 python3 -m weditor 输入设备名称&#xff0c;点击【connect】出现绿色为连接成功 获取到

vscode中git相应插件的使用(强化工作效率)

git graph 这篇文章写的不错&#xff1a;Git Graph 对于git graph的插件的使用&#xff1a; 1、首先vscode-extension中去下载 2、打开 相应的项目&#xff0c;然后在vscode左边底下去找到git graph标识然后打开就可以看到commit记录的可视化形式了。 能够很清晰的看到你的提…

自定义股票池策略周报告---收益1.8,回撤0.7,提供实盘设置

综合交易模型已经交易了1个月了目前收益10&#xff0c;回测0.8&#xff0c;策略追求稳稳的幸福&#xff0c;细水流长&#xff0c;回测年化20&#xff0c;最大回撤8 链接自定义股票池策略周报告---收益1.8&#xff0c;回撤0.7&#xff0c;提供实盘设置 (qq.com) 实盘稳定运行2…

镜像的使用条件

Q&#xff1a;老师&#xff0c;我怎么才能把做了一半的脸直接复制呢&#xff1f; A&#xff1a;镜像&#xff0c;但是镜像是有条件的 Q&#xff1a;镜像的使用条件有哪些呢&#xff1f; A&#xff1a; 1.对称面不能存在&#xff0c;必须是镂空的&#xff08;以哪个面做对称…

yolov8学习笔记(一)网络结构

一、yolov8.yaml YOLOv8详解 【网络结构代码实操】&#xff1a; YOLOv8详解 【网络结构代码实操】-CSDN博客文章浏览阅读10w次&#xff0c;点赞559次&#xff0c;收藏2.9k次。YOLOv8 算法的核心特性和改动可以归结为如下&#xff1a;提供了一个全新的 SOTA 模型&#xff0c;包…

SQL Server——建表时为字段添加注释

在 MySQL 中&#xff0c;新建数据库表为字段添加注释可以使用 comment 属性来实现。SQL Server 没有 comment 属性&#xff0c;但是可以通过执行 sys.sp_addextendedproperty 这个存储过程添加扩展属性来实现相同的功能。 这个存储过程的参数定义如下&#xff1a; exec sys.s…

TiDB 社区智慧合集丨TiDB 相关 SQL 脚本大全

非常感谢各位 TiDBer 在之前 【TiDBer 唠嗑茶话会 48】非正式 TiDB 相关 SQL 脚本征集大赛&#xff01;( https://asktug.com/t/topic/996635 )里提供的各种常用脚本。 在这篇文章中&#xff0c;我们整理了社区同学提供的一系列 TiDB 相关 SQL 脚本&#xff0c;希望能为大家在…

基于Springboot实现课程评分系统设计和实现

基于java Springboot实现课程评分系统设计和实现 博主介绍&#xff1a;5年java开发经验&#xff0c;专注Java开发、定制、远程、文档编写指导等,csdn特邀作者、专注于Java技术领域 作者主页 央顺技术团队 Java毕设项目精品实战案例《1000套》 欢迎点赞 收藏 ⭐留言 文末获取源码…

Floyd算法详解

这里是引用 文章目录 写在前面要说floyd就不能只说板子状态转移空间优化kij or ijk 应用求多源最短路求传递闭包求无向图的最小环 写在前面 在做洛谷的树上dp题单的时候遇到了一道题目P1613 跑路发现自己对flyod的理解太浅薄了&#xff0c;于是去重新学习了一遍&#xff0c;又…

1.系统调用接口

1. 系统调用接口 1.1 Linux系统调用概念 系统调用&#xff08;systemcall&#xff09;&#xff1a; 所有的操作系统在内核里都有一些内建的函数&#xff0c;这些函数完成对硬件的访问和对文件的打开、读、写、关闭等操作。 Linux 系统中称这些函数为系统调用。这些函数实现了…

Java学习笔记2024/2/23

今日内容 多态 包 final 权限修饰符 代码块 教学目标 能够说出使用多态的前提条件理解多态的向上转型理解多态的向下转型能够知道多态的使用场景包的作用public和private权限修饰符的作用描述final修饰的类的特点描述final修饰的方法的特点描述final修饰的变量的特点 第…

Unity实现帧序列

一、目的 1.想实现序列帧效果 自己使用Animation一直无法实现动画播放效果 二、参考 1. Unity序列帧动画——Sprite图片集制作UI动画_unity 序列帧动画图集-CSDN博客 结果&#xff1a;很好用&#xff0c;能实现效果 三、实操 新建Image&#xff0c;增加Animator组件&#x…

【行业交流】优积科技·国住人居与广东保利就学校、居住场景下模块化建筑技术的运用进行交流

近日&#xff0c;保利发展控股集团股份有限公司&#xff08;以下简称“保利发展”&#xff09;、 优积建筑科技发展(上海)有限公司&#xff08;以下简称“优积科技”&#xff09;、国住人居工程顾问有限公司&#xff08;以下简称“国住人居公司”&#xff09;就模块化建造体系与…

操作系统--多线程的互斥、同步

一、概念 在进程/线程并发执行的过程中&#xff0c;进程/线程之间存在协作的关系&#xff0c;例如有互斥、同步的关系。 1.互斥 由于多线程执行操作共享变量的这段代码可能会导致竞争状态&#xff0c;因此我们将此段代码称为临界区&#xff08;critical section&#xff09;…

SIP 会话发起协议

目录 会话发起协议 SIP SIP 系统的构件 SIP 的地址 SIP 特点 一个简单的 SIP 会话 会话描述协议 SDP 会话发起协议 SIP H.323 过于复杂&#xff0c;不便于发展基于 IP 的新业务。 会话发起协议 SIP (Session Initiation Protocol) 是一套较为简单且实用的标准&#xff0…

CondaValueError: Malformed version string ‘~‘: invalid character(s)

使用conda 安装一些库时出现以下报错&#xff1a; CondaValueError: Malformed version string ~: invalid character(s)尝试进行更新conda conda upgrade -n base conda或者如果是环境方面的问题&#xff0c; conda upgrade -n base -c defaults --override-channels conda如…

day41WEB 攻防-通用漏洞XMLXXE无回显DTD 实体伪协议代码审计

本章知识点&#xff1a; 1 、 XML&XXE- 原理 & 发现 & 利用 & 修复等 2 、 XML&XXE- 黑盒模式下的发现与利用 3 、 XML&XXE- 白盒模式下的审计与利用 4 、 XML&XXE- 无回显 & 伪协议 & 产生层面 配套资源&#xff08;百度网盘&#x…

LLMs之Gemma:Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略

LLMs之Gemma&#xff1a;Gemma(Google开发的新一代领先的开源模型)的简介、安装、使用方法之详细攻略 导读&#xff1a;此文章介绍了Google推出的新一代开源模型Gemma&#xff0c;旨在帮助研发人员负责任地开发AI。 背景&#xff1a; >> Google长期致力于为开发者和研究人…

基于R语言地理加权回归、主成份分析、判别分析等空间异质性数据分析

在自然和社会科学领域有大量与地理或空间有关的数据&#xff0c;这一类数据一般具有严重的空间异质性&#xff0c;而通常的统计学方法并不能处理空间异质性&#xff0c;因而对此类型的数据无能为力。以地理加权回归为基础的一系列方法&#xff1a;经典地理加权回归&#xff0c;…