首页 > 其他分享 >十五 528. 奶酪 (并查集)

十五 528. 奶酪 (并查集)

时间:2024-03-26 15:37:31浏览次数:32  
标签:int 奶酪 查集 father private static sc 528 find

528. 奶酪 (并查集)
image

思路:大体就是并查集的模板,空洞数组从1到n,增加0作为下表面,n+1作为上表面,遍历所有空洞,若与上下表面相切或是相交就将i join 到0或n+1,然后再比较任意两个空洞,两者相切或是相交就join起来,最后判断0与n+1是否相连。

import java.util.*;

public class Main {
    private static int T, n, h, r;
    private static int[][] holes;
    private static int[] father;
    
    private static void init() {
        for (int i = 0; i < father.length; i++) {
            father[i] = i;
        }
    }
    
    private static int find(int u) {
        if (u == father[u]) {
            return u;
        } else {
            father[u] = find(father[u]);
            return father[u];
        }
    }
    
    private static boolean isSame(int u, int v) {
        u = find(u);
        v = find(v);
        return u == v;
    }
    
    private static void join(int u, int v) {
        u = find(u);
        v = find(v);
        if (u == v) {
            return;
        }
        father[v] = u;
    }
    
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        T = sc.nextInt();
        while (T-- > 0) {
            n = sc.nextInt();
            h = sc.nextInt();
            r = sc.nextInt();
            father = new int[n + 2];
            init();
            
            holes = new int[n + 1][3];
            for (int i = 1; i <= n; i++) {
                holes[i][0] = sc.nextInt();
                holes[i][1] = sc.nextInt();
                holes[i][2] = sc.nextInt();
                if (Math.abs(holes[i][2]) <= r) {
                    join(i, 0);
                }
                if (Math.abs(holes[i][2] - h) <= r) {
                    join(i, n + 1);
                }
            }
            
            for (int i = 2; i <= n; i++) {
                for(int j = 1; j < i; j++) {
                    long dx = holes[i][0] - holes[j][0];
                    long dy = holes[i][1] - holes[j][1];
                    long dz = holes[i][2] - holes[j][2];
                    if (dx * dx + dy * dy + dz * dz <= 4 * (long) r * r) {
                        join(i, j);
                    }
                }
            }
            
            if (isSame(0, n + 1)) {
                System.out.println("Yes");
            }
            else {
                System.out.println("No");
            }
        }
    }
}

标签:int,奶酪,查集,father,private,static,sc,528,find
From: https://www.cnblogs.com/he0707/p/18096764/lanqiaobei15

相关文章

  • 并查集专题(附并查集模板)P3367 【模板】并查集 P1656 炸铁路
    并查集模板f数组要初始化autofind(autox){if(f[x]==x)returnx;elsereturnf[x]=find(f[x])路径压缩,同一条路上都归到一个点上}voidunionset(autoa,autob){f[find(a)]=find(b);auto会自动适配数据类型} P3367【模板】并查集题目描述如题......
  • 并查集(反集)进阶 P1892 [BOI2003] 团伙
    现在有 n 个人,他们之间有两种关系:朋友和敌人。我们知道:一个人的朋友的朋友是朋友一个人的敌人的敌人是朋友现在要对这些人进行组团。两个人在一个团体内当且仅当这两个人是朋友。请求出这些人中最多可能有的团体数。输入格式第一行输入一个整数 n 代表人数。第二行......
  • 蓝桥杯算法集训 - Week 4:BFS、并查集、Flood Fill、哈希、单调栈/队列
    蓝桥杯算法集训-Week4本系列随笔用于整理AcWing题单——《蓝桥杯集训·每日一题2024》的系列题型及其对应的算法模板。一、BFSBFS算法复习参考:BFS(Java)广度优先搜索简单介绍、模板、案例(一)Ⅰ、代码模板staticvoidbfs(Troot){//双端队列,用来存储元素D......
  • 并查集
    并查集畅通工程某省调查城镇交通状况,得到现有城镇道路统计表,表中列出了每条道路直接连通的城镇。省政府“畅通工程”的目标是使全省任何两个城镇间都可以实现交通(但不一定有直接的道路相连,只要互相间接通过道路可达即可)。问最少还需要建设多少条道路?Input测试输入包含若干测试......
  • lc2528 最大化城市的最小电量
    给定数组st[n],其中st[i]表示第i座城市的供电数目,每个供电站的供电范围是r,一座城市的电量是所有能给它供电的供电站数目之和,现在还可建k座发电站,求所有城市中最小电量的最大值。1<=n<=1e5;0<=st[i]<=1e5;0<=r<n;0<=k<=1e9最大化最小值,或者最小化最大值,常用的方法是二分答案。......
  • CF938G-动态连通图最短xor路(线段树分治、并查集、线性基)
    link:https://codeforces.com/contest/938/problem/G[!Description]有一张连通的无向图简单图,三种操作:1、加边\((x,y,d)\)2、删边\((x,y)\)3、询问\(x\toy\)的路径中异或最小的路径(不一定是简单路径)保证每次操作后图是连通的\(1\leqn,m,q\leq2\times10^5\).这......
  • 动态开点并查集+树上差分
    https://www.acwing.com/problem/content/description/2071/每次合并的时候需要开一个新点去实现信息的无后效性,也就是合并之前的两个连通块信息是无法共享的,发现这样开点连边最后形成一棵树,每次我们将信息传递到新点,也是两个合并点的lca,这使得最后求答案的直接求一边树上前缀和......
  • 数据结构(七)并查集---以题为例
    一共有 n 个数,编号是 1∼n,最开始每个数各自在一个集合中。现在要进行 m 个操作,操作共有两种:Mab,将编号为 a 和 b 的两个数所在的集合合并,如果两个数已经在同一个集合中,则忽略这个操作;Qab,询问编号为 a 和 b 的两个数是否在同一个集合中;输入格式第一行输入整......
  • 并查集
    并查集并查集是一种可以动态维护若干个不重叠集合,并且支持合并与查询的数据结构,主要用于处理不相交集合的的合并关系。为了具体实现并查集这种数据结构,首先我们需要定义集合的表示方法。在并查集中,我们采用"代表元"法,即为每一个集合选择一个固定的元素,作为整个集合的代表。其......
  • 并查集
    模板题:https://www.luogu.com.cn/problem/P1551题解:#include<bits/stdc++.h>usingnamespacestd;intn,m,p;intfa[5050];intfind(intx){returnfa[x]==x?x:fa[x]=find(fa[x]);}intquery(intx,inty){intfx=find(x),fy=fi......