【备战秋招】每日一题:4月15日美团春招第三题:题面+题目思路 + C++/python/js/Go/java带注释

news2024/11/16 13:54:54

为了更好的阅读体检,为了更好的阅读体检,,可以查看我的算法学习博客第三题-交通规划

在线评测链接:P1237

题目内容

塔子哥所在的国家有 n 个城市,这 n 个城市排成一列,按顺序编号为 1,2,3,...,n。然而,由于历史原因和地理条件等多种原因,这些城市之间并没有相互连接的铁路,导致交通十分不便。

为了改善这种情况,政府决定修建一些铁路来提高城市之间的交通效率。具体来说,政府计划在未来的 T 天内进行一系列铁路建设工作。每一天,政府会进行如下操作之一:

  • L x:在编号为 x 的城市和其左边的城市之间修建一条铁路,以便两个城市之间的交通更加便利。如果 x 已经位于最左边,或者 x 和它左边的城市之间已经存在铁路,则该操作无效。

  • R x:在编号为 x 的城市和其右边的城市之间修建一条铁路,以便两个城市之间的交通更加便利。如果 x 已经位于最右边,或者 x 和它右边的城市之间已经存在铁路,则该操作无效。

  • Q x:查询从编号为 x 的城市出发,最远能够到达的向左和向右的城市的编号。

塔子哥需要编写一段程序来模拟这一系列操作,并及时输出每个 Q x 操作的结果。通过这个程序,政府可以更加高效地规划城市之间的交通网络,从而促进经济和社会的发展。

输入描述

第一行输入两个正整数 n , T ; 接下来 T 行,每行输入形如题面中的其中一种。

1\le n\le 100001\le T\le 2001\le x\le n

输出描述

对于每一个Q x 操作,输出一行两个正整数,分别表示 x 往左边和往右边最远能到达的城市编号中间用空格隔开。

样例

输入

3 5
Q 2
L 2
Q 2
R 2
Q 2

输出

2 2
1 2
1 3

思路

并查集

考虑将n个城市看成图上的n个节点。那么

  • 每次将两个城市之间连通,相当于在点 u 和点 v 之间连一条

  • 每次查询一个城市可以向左和向右到达的最远城市,这启发我们并查集合并时需要维护两个值,一个合并时总是指向值更小的,一个合并时总是指向值更大的。即维护集合最大最小值

知识点学习:并查集

完全没接触过或不太熟悉并查集的同学,可以参考以下学习路线:

1.并查集算法讲解 -C++实现

图论——并查集(详细版)

看完本视频之后对并查集先有一个初步的了解

2.刷题

根据塔子哥给出的类似题目推荐,刷完Leetcode的相关题目以及CodeFun2000相关题目推荐

3.进阶应用(偏竞赛难度)

如果对并查集的应用有比较大的兴趣,希望进一步接触更多更妙的内容,可以学习

1.OI-WIKI-并查集应用

2.百度搜集ATC,CF以及ICPC/CCPC区域赛真题

类似题目推荐

Leetcode

  1. 547. 朋友圈

  2. 130. 被围绕的区域

  3. 200. 岛屿数量

  4. 684. 冗余连接

  5. 323. 无向图中连通分量的数目

CodeFun2000

以下问题用BFS/DFS解决都能解决。为了更好的学习并查集,希望大家能够尽量使用并查集完成

1.P1147 阿里巴巴 2023.4.3-研发岗-第二题-又一个连通块数数题

2.P1094. 米哈游 2023.03.19-第一题-塔子哥的RBG矩阵

时间复杂度:O(n\log n)

代码

CPP

#include <bits/stdc++.h>
using namespace std;
​
const int N = 10010;
// pL:维护集合最小值 , pR:最大值
int pL[N], pR[N];
int n, m;
char op[2];
int num;
// 并查集 非递归写法
int find(int p[], int x) {
    int root = x;
    while (root != p[root]) root = p[root];
    while (x != p[x]) {
        int nx = p[x];
        p[x] = root;
        x = nx;
    }
    return root;
}
​
int main()
{
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) pL[i] = pR[i] = i;
    // 模拟
    for (int i = 1; i <= m; ++i) {
        scanf("%s%d", op, &num);
        if (*op == 'L') {
            if (num == 1) continue;
            int pa = find(pL, num - 1), pb = find(pL, num);
            if (pa == pb) continue ;
            pL[pb] = pa;
​
            pa = find(pR, num - 1), pb = find(pR, num);
            pR[pa] = pb;
        } else if (*op == 'R') {
            if (num == n) continue ;
            int pa = find(pL, num), pb = find(pL, num + 1);
            if (pa == pb) continue ;
            pL[pb] = pa;
​
            pa = find(pR, num), pb = find(pR, num + 1);
            pR[pa] = pb;
        } else {
            printf("%d %d\n", find(pL, num), find(pR, num));
        }
    }
​
    return 0;
}

Java

import java.util.Objects;
import java.util.Scanner;
​
public class Main {
​
    static int N = 100010;
    // pL:维护集合最小值 , pR:最大值
    static int[] pL = new int[N];
    static int[] pR = new int[N];
​
    static Scanner sc = new Scanner(System.in);
    // 并查集 : 寻找父亲
    static int find(int[] p, int x) {
        if (x != p[x]) p[x] = find(p, p[x]);
        return p[x];
    }
​
    public static void main(String[] args) {
        int n = sc.nextInt();
        int m = sc.nextInt();
        for (int i = 1; i <= n; ++i) pL[i] = pR[i] = i;
        // 模拟
        for (int i = 0; i < m; ++i) {
            String op = sc.next();
            int x = sc.nextInt();
​
            if ("Q".equals(op)) {
                int L = find(pL, x);
                int R = find(pR, x);
                System.out.println(L + " " + R);
            } else if ("L".equals(op)) {
                if (x == 1) continue;
                int pa = find(pL, x - 1);
                int pb = find(pL, x);
                if (pa == pb) continue;
                pL[pb] = pa;
​
                pa = find(pR, x - 1);
                pb = find(pR, x);
                if (pa == pb) continue;
                pR[pa] = pb;
            } else {
                if (x == n) continue;
                int pa = find(pL, x);
                int pb = find(pL, x + 1);
                if (pa == pb) continue;
                pL[pb] = pa;
​
                pa = find(pR, x);
                pb = find(pR, x + 1);
                if (pa == pb) continue;
                pR[pa] = pb;
            }
        }
    }
​
}

Python

n, T = map(int, input().split())
f = [i for i in range(n+1)]
​
# mi维护集合最小值 , mx 维护 最大值
mi = [i for i in range(n+1)]
mx = [i for i in range(n+1)]
# 并查集 模板
def find(x):
    global f
    if f[x] == x:
        return x
    f[x] = find(f[x])
    return f[x]
​
def mer(x, y):
    global f
    x = find(x)
    y = find(y)
    if x != y:
        f[x] = y
        mx[y] = max(mx[x], mx[y])
        mi[y] = min(mi[x], mi[y])
        
for ii in range(T):
    p, x = input().split()
    x = int(x)
    if p == 'L' and x != 1:
        mer(x, x-1)
    if p == 'R' and x != n:
        mer(x, x+1)
    if p == 'Q':
        x = find(x)
        print(mi[x], mx[x])

Go

package main
​
import (
    "fmt"
)
​
var f []int
var mi []int
var mx []int
​
func main() {
    var n, T int
    fmt.Scan(&n, &T)
    // f: 父亲
    f = make([]int, n+1)
    // mi mx 维护每个点所在集合的最大值最小值
    mi = make([]int, n+1)
    mx = make([]int, n+1)
    // 初始化 指向自己
    for i := 0; i <= n; i++ {
        f[i] = i
        mi[i] = i
        mx[i] = i
    }
    // 模拟
    for i := 0; i < T; i++ {
        var p string
        var x int
        fmt.Scan(&p, &x)
        
        if p == "L" && x != 1 {
            mer(x, x-1)
        }
        if p == "R" && x != n {
            mer(x, x+1)
        }
        if p == "Q" {
            x = find(x)
            fmt.Println(mi[x], mx[x])
        }
    }
}
​
// 并查集 模板 
​
func find(x int) int {
    if f[x] == x {
        return x
    }
    f[x] = find(f[x])
    return f[x]
}
​
func mer(x, y int) {
    x = find(x)
    y = find(y)
    if x != y {
        f[x] = y
        mx[y] = max(mx[x], mx[y])
        mi[y] = min(mi[x], mi[y])
    }
}
// 最大最小值
func max(a, b int) int {
    if a > b {
        return a
    }
    return b
}
​
func min(a, b int) int {
    if a < b {
        return a
    }
    return b
}

Js

process.stdin.resume();
process.stdin.setEncoding('utf-8');
let input = '';
process.stdin.on('data', (data) => {
  input += data;
});
​
process.stdin.on('end', () => {
    lines = input.trim().split('\n');
    let f = []
    let mi = []
    let mx = []
    const arr = lines[0].split(' ')
    const n = parseInt(arr[0])
    const T = parseInt(arr[1])
​
    // mi mx 维护每个点所在集合的最大值最小值
    for (let i = 0; i <= n; i++) {
        f[i] = i
        mi[i] = i
        mx[i] = i
    }
    // 并查集模板
    function find(x) {
        if (f[x] === x) {
            return x
        }
        f[x] = find(f[x])
        return f[x]
    }
​
    function mer(x, y) {
        x = find(x)
        y = find(y)
        if (x !== y) {
            f[x] = y
            mx[y] = Math.max(mx[x], mx[y])
            mi[y] = Math.min(mi[x], mi[y])
        }
    }
    // 模拟
    for (let i = 1; i <= T; i++) {
        const line = lines[i].trim().split(' ')
        const p = line[0]
        const x = parseInt(line[1])
​
        if (p === 'L' && x !== 1) {
            mer(x, x-1)
        }
        if (p === 'R' && x !== n) {
            mer(x, x+1)
        }
        if (p === 'Q') {
            const res = find(x)
            console.log(mi[res], mx[res])
        }
    }
});

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

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

相关文章

【备战秋招】每日一题:4月8日美团春招第五题:题面+题目思路 + C++/python/js/Go/java带注释

为了更好的阅读体检&#xff0c;为了更好的阅读体检&#xff0c;&#xff0c;可以查看我的算法学习博客第五题-RGP种树 在线评测链接:P1170 题目描述&#xff1a; 塔子哥是一位著名的冒险家&#xff0c;他经常在各种森林里探险。今天&#xff0c;他来到了道成林&#xff0c;…

【Django 网页Web开发】24. 实战项目:moudleForm的文件上传应用到城市管理(17)(保姆级图文)

目录 用户上传文件存放media如何启用1. 在urls.py中进行配置&#xff1a;2. 在settings.py中进行配置&#xff1a;3. 能够通过media的url访问文件 moudleForm上传文件实现城市管理1. moudle.py2. url.py3. city.py4. city.html5. 文件上传小结6. 城市管理效果总结 欢迎关注 『D…

Vivado远程开发探索

平时主要用轻薄本办公&#xff0c;但是有时候又需要用Vivado做一些开发的工作&#xff0c;就感觉生产力不够。如果能在远程的高性能服务器上跑Vivado综合实现就好了。前段时间用ubuntu下安装的Vivado发现有一个Remote Host的设置。所以就准备折腾一下这个。 WSL WSL的安装看官…

chatgpt赋能python:Python怎么调成黑色背景?

Python怎么调成黑色背景&#xff1f; 随着人们对代码编辑器的要求越来越高&#xff0c;许多开发者都喜欢在黑色背景下编写代码。不仅仅是视觉审美方面考虑&#xff0c;黑色背景对眼睛的伤害也比浅色背景要小得多。本篇文章将介绍如何在Python中调整为黑色背景 介绍 默认情况…

[C++刷题之旅]反转链表

&#x1f338;心有所向&#xff0c;日复一日&#xff0c;必有精进 &#x1f338;专栏&#xff1a;C刷题之旅 &#x1f338;作者&#xff1a;早凉 目录 题目一&#xff1a;反转链表 【题目链接】 【题目描述】 【解题思路】 【代码实现】 进阶&#xff1a;链表中指定区间…

【异步】Futurn、FutureTask、CompletionService、CompletableFuture

1. Callable 在这篇文章中 【Thread】线程的基本概念及创建方式&#xff08;一&#xff09;&#xff0c;我们知道创建线程的几种方式。其中&#xff0c;有两个是通过接口来实现的&#xff1a;Runnable、Callable。它们的区别如下&#xff1a; Runnable 接口中的方法是没有返回…

代码审计——XXE详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 XXE&#xff08;XML External Entity Injection&#xff09;是一种针对XML终端实施的攻击&#xff0c;漏洞产生的根本原因就是…

chatgpt赋能python:Python怎么调整行距

Python怎么调整行距 在Python中&#xff0c;我们可以使用不同的方法来调整文本行距。 在这篇文章中&#xff0c;我们将讨论最常用的两种方法&#xff1a;使用文本编辑器和使用Python代码。 使用文本编辑器 许多文本编辑器都具有设置行距的选项。 这通常在“格式”或“段落”…

SpringBoot + Mybatis Plus 实现的瀑布内容管理系统、CMS建站系统

瀑布内容管理系统 瀑布内容管理系统&#xff0c;采用SpringBoot Apache Shiro Mybatis Plus Thymeleaf 实现的内容管理系统(附带权限管理)&#xff0c;是搭建博客、网站的不二之选。 项目介绍 PB-CMS&#xff0c;致力于开发最精简、实用的CMS管理系统&#xff0c;适合搭建…

chatgpt赋能python:Python如何访问手机:探索移动端SEO优化的新途径

Python如何访问手机&#xff1a;探索移动端SEO优化的新途径 随着移动互联网的快速发展&#xff0c;移动端成为了各大搜索引擎的竞争焦点。对于SEO优化工程师而言&#xff0c;探索移动端SEO优化的新途径显得尤为关键。而Python作为一种强大的编程语言&#xff0c;在移动端SEO优…

MM32F3273G8P火龙果开发板MindSDK开发教程21 - PWM的使用

MM32F3273G8P火龙果开发板MindSDK开发教程21 - PWM的使用 1、简述 开发版的LED灯连接PA1脚&#xff0c;而PA1可以映射TIM2_CH2&#xff0c;所以我们用通用定时器2的TIM2_CH2输出PWM到PA1脚&#xff0c;通过更改PWM的占空比&#xff0c;来改变LED的亮度。 2、LED灯的初始化…

读数据压缩入门笔记06_上下文转换

1. 压缩算法可归为两类 1.1. 统计压缩&#xff08;即VLC&#xff09; 1.2. 字典压缩&#xff08;如LZ78&#xff09; 1.3. 从不同的角度利用了给定数据流中存在的统计冗余信息 2. 上下文变换 2.1. contextual transform 2.2. 给定一组相邻的符号集&#xff0c;对它们进行…

代码审计——任意文件下载详解

为方便您的阅读&#xff0c;可点击下方蓝色字体&#xff0c;进行跳转↓↓↓ 01 漏洞描述02 审计要点03 漏洞特征04 漏洞案例05 修复方案 01 漏洞描述 网站可能提供文件查看或下载的功能&#xff0c;如果对用户查看或下载的文件不做限制&#xff0c;就能够查看或下载任意的文件&…

大数据相关概念了解

Hadoop生态及Hive、HBase、Impala、HDFS之间的关系 Hadoop生态(什么是 Hadoop) Apache Hadoop软件库是一个框架&#xff0c;允许使用简单的编程模型在计算机集群之间对大型数据集进行分布式处理。它旨在从单个服务器扩展到数千台计算机&#xff0c;每台计算机都提供本地计算和…

【雕爷学编程】Arduino动手做(112)---2.4G24L01无线模块

37款传感器与执行器的提法&#xff0c;在网络上广泛流传&#xff0c;其实Arduino能够兼容的传感器模块肯定是不止这37种的。鉴于本人手头积累了一些传感器和执行器模块&#xff0c;依照实践出真知&#xff08;一定要动手做&#xff09;的理念&#xff0c;以学习和交流为目的&am…

chatgpt赋能python:Python怎么调整黑色的SEO?

Python怎么调整黑色的SEO&#xff1f; 在当今互联网的大环境下&#xff0c;各种搜索引擎的存在具有巨大的价值&#xff0c;特别是Google&#xff0c;百度等常用搜索引擎的SEO排名对于企业、个人品牌的宣传有着极其重要的意义。但是&#xff0c;如果出现黑色SEO的情况&#xff…

Spark操作HBase的数据,实现列值的计算

本文将介绍如何使用Spark操作HBase的数据&#xff0c;实现列之间的计算&#xff0c;以特征值计算为例。特征值是指从原始数据中提取出来的具有代表性或判别性的数值&#xff0c;可以用于数据分析或机器学习等领域。本文将使用hbase-spark连接器&#xff0c;通过Spark RDD的方式…

深度解析:圣湘生物的数字化转型升级之路(附方案详情)

随着“互联网”医疗技术在医疗行业的应用不断深化&#xff0c;数字化正在加速推进IVD行业的创新。 当前&#xff0c;IVD企业应对机遇和挑战的核心是提升竞争力。 IVD企业基于企业资源&#xff0c;提升综合竞争力主要分【硬实力】和【软实力】。 一方面&#xff1a;需要企业不…

跟李沐学AI;Meta可能让其开源AI模型商业化,让开发者赚钱

&#x1f989; AI新闻 &#x1f680; Meta可能让其开源AI模型商业化&#xff0c;让开发者赚钱 摘要&#xff1a;Meta正考虑将其开源大语言模型&#xff08;LLM&#xff09;的下一个版本用于商业用途&#xff0c;这可以为聊天机器人等提供支持。此举可能会让更多开发者使用替代…

张量分解(Cp、Tuker、Block-Term)

张量 张量是向量或矩阵在维度空间上的高阶扩展。 一个 ( p , q ) (p,q) (p,q)型的张量 T T T被定义为一个多重线性映射。 T : V ∗ ⋯ V ∗ V ⋯ V ↦ R , T:V^* \times \dots \times V^* \times V \times \dots \times V \mapsto \R, T:V∗⋯V∗V⋯V↦R, 其中 V V V 是…