AtCoder Beginner Contest 279 F BOX 并查集 (大意失荆州

news2024/11/29 8:48:28

前言

赛时一直RE,思路很清晰,不知道RE哪里。。qwq
赛后开断点发现,map的大小不变,
最后发现是一个if条件写错了,寄。

不知道为什么会想起 银河英雄传说

题意:

初始n个盒子,盒子 i i i放着编号为 i i i的小球
进行q次操作

  • op1:将y盒子的小球移到x盒子中
  • op2:将第k个球,加入到x盒子中
  • op3:询问球x在哪个盒子中

思路:

我们看到op1,联想到集合的合并,于时想到并查集的操作在这里插入图片描述
图中绿色的点代表盒子。

  1. 经过 多个op1,op1,op1…我们可以用并查集把这些合并到盒子2
  2. 此时,突然有个 o p 1   1   2 op_1 \ 1 \ 2 op1 1 2, 那么我们 m e r g e ( b o x [ 1 ] , b o x [ 2 ] ) merge(box[1],box[2]) merge(box[1],box[2])
merge(int x, int y){
	int fx = find(x), fy = find(y);
	p[fy] = fx;//根据题意合并
}
  1. 误区:此时突然来个 o p 2   2 op_2 \ 2 op2 2

假如新球,连到原来的盒子p[k] = find(box[2]) ,最后会使得新球在盒子1其实新球在盒子2

因为p[box[2]] == p[box[1]]

做法

  • 对于每个盒子和点都编号
  • 每次操作1后,把 y y y盒子删除,新建一个 y ‘ y ` y
box[y] = ++newBox;

What’s more

看了SSRS,好像可以用启发式合并,一开始我也是想用,但后面发现新开点,就可以解决了。

Java

package com.hgs.atcoder.abc.contest279.f;

/**
 * @author youtsuha
 * @version 1.0
 * Create by 2022/11/26 19:43
 */
import java.util.*;
import java.io.*;
public class Main{
    static FastScanner cin;
    static PrintWriter cout;

    private static void init()throws IOException {
        cin = new FastScanner(System.in);
        cout = new PrintWriter(System.out);
    }

    private static void close(){
        cout.close();
    }
    static int[] p;
    static int find(int x){
        if(x == p[x]) {
            return p[x];
        }
        return p[x] = find(p[x]);
    }
    private static void sol()throws IOException {
        int n = cin.nextInt(), m = cin.nextInt();
        int tot = n  + m;
        p = new int[tot*2 + 1];
        Map<Integer,Integer> curBox = new HashMap<>();
        Map<Integer,Integer> boxPre = new HashMap<>();
        int newBox = tot;
        //[1,tot] balls
        //[tot+1,tot*2] boxs
        for(int i = 1; i <= tot*2; i ++ ) {
            p[i] = i;
            if(i > tot && i <= tot + n){
                newBox++;
                curBox.put(i - tot,i);
                boxPre.put(i,i-tot);
            }else if(i <= n){
                p[i] = i + tot;
            }
        }
        int k = n;
        for(int i = 1; i <= m; i ++ ) {
            int op = cin.nextInt(), x = cin.nextInt();
            if(op == 1){
                int y = cin.nextInt();
                //y-->x
                int preY = curBox.get(y);
                p[preY] = p[curBox.get(x)];

                boxPre.put(++newBox,y);
                curBox.put(y,newBox);
            }else if(op == 2){
                k++;
                p[k] = curBox.get(x);
            }else {
                cout.println(boxPre.get(find(p[x])));
            }
        }

    }
    public static void main(String[] args) throws IOException {
        init();
        sol();
        close();
    }
}
class FastScanner {
    BufferedReader br;
    StringTokenizer st = new StringTokenizer("");

    public FastScanner(InputStream s) {
        br = new BufferedReader(new InputStreamReader(s));
    }

    public FastScanner(String s) throws FileNotFoundException {
        br = new BufferedReader(new FileReader(new File(s)));
    }

    public String next() throws IOException {
        while (!st.hasMoreTokens()){
            try {
                st = new StringTokenizer(br.readLine());
            } catch (IOException e) { e.printStackTrace(); }
        }
        return st.nextToken();
    }

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

    public long nextLong() throws IOException {
        return Long.parseLong(next());
    }

    public double nextDouble() throws IOException {
        return Double.parseDouble(next());
    }
}

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

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

相关文章

2023年天津财经大学珠江学院专升本退役士兵免试职业技能考查大纲

天津财经大学珠江学院2023年高职升本科职业技能综合考查考试大纲 &#xff08;仅适用于符合条件的退役士兵考生&#xff09;《管理学原理》 一、本大纲系天津财经大学珠江学院2023年高职升本科《管理学原理》职业技能综合考查考试大纲&#xff0c;仅适用于符合条件的退役士兵考…

面试官:synchronized与Lock有什么区别?

作为一名程序员&#xff0c;在求职面试时&#xff0c;不知道你在求职面试时常会遇到关于线程的问题。张工是一名java程序员&#xff0c;3年多工作经验&#xff0c;有次到一家互联网公司面试软件开发工程师岗位&#xff0c;面试官就问了他这样一个问题。synchronized与Lock有什么…

Android APP深度优化—内存映射机制(mmap)

mmap原理 open一个文件&#xff0c;然后调用mmap系统调用&#xff0c;将文件的内容的全部或一部分直接映射到进程虚拟空间中文件存储映射部分&#xff1b;完成映射关系后&#xff0c;mmap返回值是一个指针&#xff0c;进程可以通过采用指针方式读写操作这一段内存&#xff1b;…

vue3 antd项目实战——使用filter实现简单的table表格搜索功能

零基础filter实现最简单的table表格知识调用核心干货下期预告关键字模糊查找&#xff08;纯前端&#xff09;关键字模糊查找&#xff08;前后交互&#xff09;知识调用 功能实现可能要用到的知识&#xff1a;vue3ant design vuets实战【ant-design-vue组件库引入】vue3项目实战…

MyBatis-Plus删除操作知识点总结

系列文章目录 Mybatis-Plus知识点[MyBatisMyBatis-Plus的基础运用]_心态还需努力呀的博客-CSDN博客 Mybatis-PlusSpringBoot结合运用_心态还需努力呀的博客-CSDN博客MyBaits-Plus中TableField和TableId用法_心态还需努力呀的博客-CSDN博客MyBatis-Plus中的更新操作&#xf…

移动无线点餐客户端的研究与实现(Java+Android)

目录 1 绪 论 2 1.1 研究的背景及意义 2 1.2 本文主要内容 2 2.1 系统架构 3 2.2 关键技术 3 2.2.1 JDBC 3 2.2.2 Jquery 4 2.2.3 Ajax 4 2.3 开发环境及平台 5 2.3.1 Eclipse 5 2.3.2 MyEclipse 6 2.3.3 Tomcat服务器 6 2.3.4 应用平台Android 7 3 订餐系统分析与设计 9 3.1需…

机器学习:图文详解密度聚类DBSCAN算法(附Python实现)

目录0 写在前面1 密度聚类2 DBSCAN算法3 Python实现3.1 算法复现3.2 可视化实验0 写在前面 机器学习强基计划聚焦深度和广度&#xff0c;加深对机器学习模型的理解与应用。“深”在详细推导算法模型背后的数学原理&#xff1b;“广”在分析多个机器学习模型&#xff1a;决策树…

C#线程间操作无效:从不是创建控件“textbox1”的线程访问它

在C#的多线程访问中&#xff0c;在线程间的相互访问时因为线程安全问题有访问限制&#xff0c;在创建一般线程时&#xff0c;对于界面元素访问时这样的问题比较常见。 比如&#xff0c;创建一个form1&#xff0c;上面放置一个textbox控件&#xff0c;创建一个线程去访问textbox…

3_SpringMVC_执行流程

1DispatcherServlet&#xff1a;前端控制器 用户请求到达前端控制器&#xff0c;它就相当于 mvc 模式中的 c&#xff0c;dispatcherServlet 是整个流程控制的中心&#xff0c;由 它调用其它组件处理用户的请求&#xff0c;dispatcherServlet 的存在降低了组件之间的耦合性。 2…

【学习笔记43】JavaScript的事件

JavaScript的事件一、JS的事件1、事件的三要素2、DOM 0级事件绑定3、DOM 2级事件绑定(事件监听)二、浏览器事件三、鼠标事件1. 左键单击&#xff1a;click2. 双击事件&#xff1a;dblclick3.右键事件&#xff1a;contextmenu4. 鼠标按下事件&#xff1a;mousedown5. 鼠标抬起事…

编写Servlet代码获取页面body中json数据

目录 1、在 maven 项目中引入 jackson 2、编写代码 ① 介绍 jackson 提供操作 json 数据的类和方法 ② 确定 json 数据格式&#xff0c;并写出对应的类 ③ 编写servlet代码 3、使用 postman 发送数据观察结果 4、拓展 readValue 方法返回构造对象的过程 本文使用maven项目&…

HTML5详解

文章目录1 网页基本标签1.2 标题标签1.3 段落标签1.4 换行标签1.5 水平线标签1.6 字体样式标签1.7 注释和特殊符号2 图像、超链接、网页布局2.1 图像2.2 超链接标签2.3 块元素和行内元素2.4 网页布局3 列表、表格、媒体元素、iframe内联框架3.1 列表3.2 表格3.3 媒体元素3.4 if…

Unity 之 安卓堆栈跟踪和日志工具 (Android Logcat | 符号表解析Bugly捕获)

Unity 之 日志解析工具 Android Logcat一&#xff0c;工具集成1.1 注意事项1.2 导入插件二&#xff0c;连接设备2.1 使用USB连接2.2 无线连接三&#xff0c;实用功能介绍3.1 通用介绍3.2 堆栈跟踪工具 -- 解析Bugly捕获报错一&#xff0c;工具集成 Logcat是开发者必备的工具&a…

ps,查看Linux系统进程信息小帮手-尚文网络xUP楠哥

~~全文共852字&#xff0c;阅读需约5分钟。 进Q群11372462&#xff0c;领取专属报名福利&#xff0c;包含云计算学习路线图代表性实战训练大厂云计算面试题资料! ps命令在Linux系统中非常的常用&#xff0c;主要是帮助我们查看系统进程的详细信息&#xff0c;其中&#xff0c;…

Jetson Nano如何安装 onnxruntime gpu Python包

Jetson Nano 可以直接 pip 安装 cpu 版本的 onnxruntime 用 pypi 的源&#xff0c;直接安装 onnxruntime-gpu 或者 onnxruntime_gpu 都会报找不到对应的架构 aarch64 本来以为要用官方库编译一下 https://github.com/microsoft/onnxruntime 幸运的是&#xff0c;NVIDIA官方帮…

地级市市场化指数+樊纲市场化指数(包含分省、市两份数据)

一、地级市市场化指数 1、数据来源&#xff1a;各省份年鉴以及地级市统计公报 2、时间跨度&#xff1a;1998-2020年 3、区域范围&#xff1a;422&#xff08;城市和区&#xff09; 4、指标说明&#xff1a; 依据樊纲市场化各指标&#xff0c;结合各地级市的相关数据算出来…

Typecho中handsome主题如何增加侧边导航栏

&#x1f482;作者简介&#xff1a; THUNDER王&#xff0c;一名热爱财税和SAP ABAP编程以及热爱分享的博主。目前于江西师范大学会计学专业大二本科在读&#xff0c;同时任汉硕云&#xff08;广东&#xff09;科技有限公司ABAP开发顾问。在学习工作中&#xff0c;我通常使用偏后…

【心电信号】小波阙值心电信号去噪【含Matlab源码 2188期】

⛄一、小波阈值法去噪概述 电能质量扰动信号的噪声大多以高斯白噪声的形式存在&#xff0c;利用小波变换对信号进行多分辨率分解&#xff0c;由于小波变换具有去除数据相关性的特点&#xff0c;故可以将有用信号与噪声的能量分离开来。信号中有效的信息主要集中在较大的小波系…

【Vue】Vuex-store

Vuex是什么&#xff1f; Vuex是实现组件全局状态(数据&#xff09;管理的一种机制&#xff0c;可以方便的实现组件之间数据的共享。 像一个仓库一样&#xff01; 使用Vuex统一管理状态的好处&#xff1f; 1.能够在vuex中集中管理共享的数据&#xff0c;易于开发和后期维护 2.能…

二叉查找树(1)-二叉树-数据结构和算法(Java)

文章目录1 前言1.1 二叉查找树定义1.2 二叉查找树的性质2 基本实现2.1 API2.2 实现代码2.2.1 数据表示2.2.2 查找2.2.3 插入3 分析4 有序性相关方法与删除操作4.1 最大键和最小键4.2 向上取整和向下取整4.2.1 向下取整floor()4.2.2 向上取整ceiling()4.3 选择select()4.4 排名r…