結果

問題 No.2923 Mayor's Job
ユーザー hirohisohirohiso
提出日時 2024-10-12 16:09:25
言語 Java21
(openjdk 21)
結果
AC  
実行時間 964 ms / 2,000 ms
コード長 11,220 bytes
コンパイル時間 4,145 ms
コンパイル使用メモリ 88,676 KB
実行使用メモリ 148,292 KB
最終ジャッジ日時 2024-10-12 16:09:35
合計ジャッジ時間 9,321 ms
ジャッジサーバーID
(参考情報)
judge2 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 60 ms
37,128 KB
testcase_01 AC 59 ms
37,500 KB
testcase_02 AC 61 ms
37,572 KB
testcase_03 AC 149 ms
40,736 KB
testcase_04 AC 964 ms
148,292 KB
testcase_05 AC 201 ms
42,536 KB
testcase_06 AC 166 ms
41,152 KB
testcase_07 AC 234 ms
46,172 KB
testcase_08 AC 227 ms
46,288 KB
testcase_09 AC 181 ms
42,132 KB
testcase_10 AC 224 ms
46,188 KB
testcase_11 AC 781 ms
116,380 KB
testcase_12 AC 622 ms
92,260 KB
testcase_13 AC 242 ms
49,320 KB
testcase_14 AC 110 ms
39,940 KB
testcase_15 AC 70 ms
37,376 KB
testcase_16 AC 61 ms
36,976 KB
testcase_17 AC 65 ms
36,864 KB
testcase_18 AC 61 ms
37,332 KB
testcase_19 AC 58 ms
37,384 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.IOException;
import java.io.InputStream;
import java.io.PrintStream;
import java.io.PrintWriter;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.text.Format;
import java.util.*;
import java.util.function.BinaryOperator;
import java.util.function.Function;
import java.util.function.IntPredicate;
import java.util.function.Predicate;
import java.util.stream.Collectors;
import java.util.stream.IntStream;

@SuppressWarnings("unchecked")
public class Main {
    public static void main(String[] args) {
        solve(System.in, System.out);
    }

    private void solve(PrintWriter pw, FastScanner fs) {
        var N = fs.ni();
        var K = fs.nl();
        var Hn = fs.nia(N);

        var pairs = new Pair[N];
        for (int i = 0; i < N; i++) {
            var x = fs.nl();
            var y = fs.nl();

            pairs[i] = new Pair(x, y);
            pairs[i] = new Pair(x, y);
        }


        var list = new ArrayList<ArrayList<Integer>>();
        for (int i = 0; i < N; i++) {
            list.add(new ArrayList());
        }
        for (int i = 0; i < N; i++) {
            for (int j = i + 1; j < N; j++) {
                var t = pairs[i];
                var s = pairs[j];

                var dx = Math.abs(t.a - s.a);
                var dy = Math.abs(t.b - s.b);
                if (K * K >= dx * dx + dy * dy) {
                    if (Hn[i] > Hn[j]) {
                        list.get(j).add(i);
                    } else if (Hn[i] < Hn[j]) {
                        list.get(i).add(j);
                    }
                }
            }
        }


        debug(list);
        var dfs = new Dfs(list);
        var ans = dfs.ans();
        debug(dfs.ans);
        pw.println(ans);
    }

    static class Dfs {
        ArrayList<ArrayList<Integer>> list;
        boolean[] visit;
        TreeSet<Integer> ans;

        public Dfs(ArrayList<ArrayList<Integer>> list) {
            this.list = list;
        }

        public int ans() {
            this.visit = new boolean[list.size()];
            this.ans = new TreeSet<>();
            for (int i = 0; i < list.size(); i++) {
                if (!visit[i]) {
                    visit[i] = true;
                    dfs(i);
                }
            }
            return ans.size();
        }

        private void dfs(int n) {
            var list = this.list.get(n);
            var flg = true;
            for (int v : list) {
                if (visit[v]) {
                    continue;
                }
                visit[v] = true;
                flg = false;
                dfs(v);
            }
            if (list.size() == 0) {
                ans.add(n);
            }
        }
    }

    //--------------
    record TPair<S, T>(S a, T b) {
    }

    record TTri<S, T, U>(S a, T b, U c) {
    }

    record Pair(long a, long b) {
    }

    record IntPair(int a, int b) {
    }

    record Triple(long a, long b, long c) {
    }

    public static int[] concat(int[] a, int[] b) {
        var ret = new int[a.length + b.length];
        for (int i = 0; i < a.length; i++) {
            ret[i] = a[i];
        }
        for (int i = 0; i < b.length; i++) {
            ret[i + a.length] = b[i];
        }
        return ret;
    }

    public static long[] concat(long[] a, long[] b) {
        var ret = new long[a.length + b.length];
        for (int i = 0; i < a.length; i++) {
            ret[i] = a[i];
        }
        for (int i = 0; i < b.length; i++) {
            ret[i + a.length] = b[i];
        }
        return ret;
    }


    public static void solve(InputStream in, PrintStream out) {
        PrintWriter pw = new PrintWriter(out);
        FastScanner fs = new FastScanner(in);
        try {
            new Main().solve(pw, fs);
        } finally {
            pw.flush();
        }
    }


    //-------------------------------------------------------------------
    private static void debug(Object x) {
        System.err.println(x);
    }

    private static void debugArray(int[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            debugArray(arr[i]);
        }
    }

    private static void debugArray(long[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            debugArray(arr[i]);
        }
    }


    private static void debugArray(int[] arr) {
        debug(Arrays.toString(arr));
    }

    private static void debugArray(long[] arr) {
        debug(Arrays.toString(arr));
    }

    private static void debugArray(boolean[] arr) {
        debug(Arrays.toString(arr));
    }

    private static void debugArray(boolean[][] arr) {
        for (int i = 0; i < arr.length; i++) {
            debugArray(arr[i]);
        }
    }


    /**
     * 各インデックスが配列の長さ以内に収まっているか境界チェックを行う
     * <p>
     * 多次元配列のチェックをいちいち書くのがしんどい時に。
     * arrayBound(new int[]{1,2,3} , new int[]{3,4,3})
     *
     * @param target 配列に設定したいインデックス
     * @param len     配列の長さ
     * @return 配列の長さ内に収まってる時 true
     */
    private static boolean inarr(int[] target, int[] len) {
        var b = true;
        if (target.length != len.length) {
            throw new IllegalArgumentException();
        }
        for (int i = 0; i < target.length; i++) {
            b &= (0 <= target[i] && target[i] < len[i]);
        }
        return b;
    }

    private static int[] arr(int... a) {
        return Arrays.copyOf(a, a.length);
    }

    private static long[] arr(long... a) {
        return Arrays.copyOf(a, a.length);
    }

    //半時計90度回転
    private static int[][] rot(int[][] grid) {
        var h = grid.length;
        var w = grid[0].length;

        var result = new int[w][h];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                result[w - 1 - j][i] = grid[i][j];
            }
        }
        return result;
    }


//http://fantom1x.blog130.fc2.com/blog-entry-194.html

    /**
     * <h1>指定した値以上の先頭のインデクスを返す</h1>
     * <p>配列要素が0のときは、0が返る。</p>
     *
     * @param arr   : 探索対象配列(単調増加であること)
     * @param value : 探索する値
     * @return<b>int</b> : 探索した値以上で、先頭になるインデクス
     */
    public static final int lowerBound(final long[] arr, final long value) {
        int low = 0;
        int high = arr.length;
        int mid;
        while (low < high) {
            mid = ((high - low) >>> 1) + low;    //(low + high) / 2 (オーバーフロー対策)
            if (arr[mid] < value) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    }

    /**
     * <h1>指定した値より大きい先頭のインデクスを返す</h1>
     * <p>配列要素が0のときは、0が返る。</p>
     *
     * @param arr   : 探索対象配列(単調増加であること)
     * @param value : 探索する値
     * @return<b>int</b> : 探索した値より上で、先頭になるインデクス
     */
    public static final int upperBound(final long[] arr, final long value) {
        int low = 0;
        int high = arr.length;
        int mid;
        while (low < high) {
            mid = ((high - low) >>> 1) + low;    //(low + high) / 2 (オーバーフロー対策)
            if (arr[mid] <= value) {
                low = mid + 1;
            } else {
                high = mid;
            }
        }
        return low;
    }

//----------------
//-------------------------------------------------------------------
}

class FastScanner {
    InputStream in;
    byte[] buffer = new byte[1 << 10];
    int length = 0;
    int ptr = 0;
    private final Predicate<Byte> isPrintable;


    public FastScanner(InputStream in) {
        this.in = in;
        this.isPrintable = b -> (33 <= b && b <= 126);
    }

    public FastScanner(InputStream in, Predicate<Byte> predicate) {
        this.in = in;
        this.isPrintable = predicate;
    }

    private boolean hasNextByte() {
        if (ptr < length) {
            return true;
        }
        try {
            length = in.read(buffer);
        } catch (IOException e) {
            e.printStackTrace();
        }
        ptr = 0;
        return length != 0;
    }


    private byte read() {
        if (hasNextByte()) {
            return buffer[ptr++];
        }
        return 0;
    }

    private void skip() {
        while (hasNextByte() && !isPrintable(buffer[ptr])) {
            ptr++;
        }
    }

    private boolean hasNext() {
        skip();
        return hasNextByte();
    }

    private boolean isPrintable(byte b) {
        return 33 <= b && b <= 126;
    }


    private String innerNext(Predicate<Byte> isReadable) {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        StringBuilder sb = new StringBuilder();
        byte b = read();
        while (isReadable.test(b)) {
            sb.appendCodePoint(b);
            b = read();
        }
        return sb.toString();
    }

    public String n() {
        return innerNext(b -> (33 <= b && b <= 126));
    }

    public int ni() {
        return (int) nl();
    }

    public char[][] ncaa(int n, int m) {
        var grid = new char[n][m];
        for (int i = 0; i < n; i++) {
            grid[i] = n().toCharArray();
        }
        return grid;
    }

    public int[] nia(int n) {
        int[] result = new int[n];
        for (int i = 0; i < n; i++) {
            result[i] = ni();
        }
        return result;
    }

    public int[][] niaa(int h, int w) {
        int[][] result = new int[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                result[i][j] = ni();
            }
        }
        return result;
    }

    public long[][] nlaa(int h, int w) {
        long[][] result = new long[h][w];
        for (int i = 0; i < h; i++) {
            for (int j = 0; j < w; j++) {
                result[i][j] = nl();
            }
        }
        return result;
    }

    public String[] na(int n) {
        String[] result = new String[n];
        for (int i = 0; i < n; i++) {
            result[i] = n();
        }
        return result;
    }

    public long[] nla(int n) {
        long[] result = new long[n];
        for (int i = 0; i < n; i++) {
            result[i] = nl();
        }
        return result;
    }

    public long nl() {
        if (!hasNext()) {
            throw new NoSuchElementException();
        }
        long result = 0;
        boolean minus = false;
        byte b;

        b = read();
        if (b == '-') {
            minus = true;
            b = read();
        }

        while (isPrintable(b)) {
            if (b < '0' || b > '9') {
                throw new NumberFormatException();
            }
            result *= 10;
            result += (b - '0');
            b = read();
        }

        return minus ? -result : result;
    }
}

0