結果

問題 No.2657 Falling Block Game
ユーザー ks2mks2m
提出日時 2024-03-01 23:06:43
言語 Java21
(openjdk 21)
結果
TLE  
実行時間 -
コード長 2,857 bytes
コンパイル時間 2,477 ms
コンパイル使用メモリ 86,080 KB
実行使用メモリ 123,532 KB
最終ジャッジ日時 2024-09-29 14:51:47
合計ジャッジ時間 9,895 ms
ジャッジサーバーID
(参考情報)
judge5 / judge1
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 130 ms
54,192 KB
testcase_01 AC 133 ms
54,256 KB
testcase_02 AC 133 ms
54,304 KB
testcase_03 AC 129 ms
54,392 KB
testcase_04 AC 930 ms
102,276 KB
testcase_05 AC 1,805 ms
119,772 KB
testcase_06 TLE -
testcase_07 -- -
testcase_08 -- -
testcase_09 -- -
testcase_10 -- -
testcase_11 -- -
testcase_12 -- -
testcase_13 -- -
testcase_14 -- -
testcase_15 -- -
testcase_16 -- -
testcase_17 -- -
testcase_18 -- -
testcase_19 -- -
testcase_20 -- -
testcase_21 -- -
testcase_22 -- -
testcase_23 -- -
testcase_24 -- -
testcase_25 -- -
testcase_26 -- -
testcase_27 -- -
testcase_28 -- -
testcase_29 -- -
testcase_30 -- -
testcase_31 -- -
testcase_32 -- -
testcase_33 -- -
testcase_34 -- -
testcase_35 -- -
testcase_36 -- -
testcase_37 -- -
testcase_38 -- -
testcase_39 -- -
権限があれば一括ダウンロードができます

ソースコード

diff #

import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Set;
import java.util.TreeSet;

public class Main {
	public static void main(String[] args) throws Exception {
		Scanner sc = new Scanner(System.in);
		int h = sc.nextInt();
		int w = sc.nextInt();
		char[][] s = new char[h][w];
		for (int i = 0; i < h; i++) {
			s[i] = sc.next().toCharArray();
		}
		sc.close();

		int inf = 100000000;
		int[][] d = new int[h][w];
		for (int i = 0; i < h; i++) {
			Arrays.fill(d[i], inf);
		}

		List<TreeSet<Integer>> list = new ArrayList<>(h - 1);
		List<TreeSet<Integer>> listb = new ArrayList<>(h - 1);
		for (int i = 0; i < h - 1; i++) {
			TreeSet<Integer> set = new TreeSet<>();
			TreeSet<Integer> setb = new TreeSet<>();
			for (int j = 0; j < w; j++) {
				if (s[i][j] == '.') {
					set.add(j);
				} else {
					setb.add(j);
				}
			}
			list.add(set);
			setb.add(-1);
			setb.add(w);
			listb.add(setb);
		}

		PriorityQueue<Obj> que = new PriorityQueue<>((o1, o2) -> o1.d - o2.d);
		int h1 = h - 1;
		for (int j = 0; j < w; j++) {
			if (s[h1][j] == '.') {
				d[h1][j] = 0;
				que.add(new Obj(h1, j, d[h1][j]));
			}
		}

		List<Integer> remList = new ArrayList<>();
		while (!que.isEmpty()) {
			Obj o = que.poll();
			if (d[o.i][o.j] < o.d) {
				continue;
			}
			if (o.i > 0 && s[o.i - 1][o.j] == '.') {
				int ni = o.i - 1;
				int end = Math.min(o.j + o.d + 1, listb.get(ni).ceiling(o.j));
				TreeSet<Integer> set = list.get(ni);
				Set<Integer> ss = set.subSet(o.j, end);
				for (int nj : ss) {
					int alt = o.d;
					if (d[ni][nj] > alt) {
						d[ni][nj] = alt;
						que.add(new Obj(ni, nj, alt));
					}
					remList.add(nj);
				}
				set.removeAll(remList);
				remList.clear();

				end = Math.max(o.j - o.d, listb.get(ni).floor(o.j) + 1);
				ss = list.get(ni).subSet(end, true, o.j, true).descendingSet();
				for (int nj : ss) {
					int alt = o.d;
					if (d[ni][nj] > alt) {
						d[ni][nj] = alt;
						que.add(new Obj(ni, nj, alt));
					}
					remList.add(nj);
				}
				set.removeAll(remList);
				remList.clear();
			}
			int ni = o.i;
			if (o.j > 0) {
				int nj = o.j - 1;
				if (s[ni][nj] == '.') {
					int alt = o.d + 1;
					if (d[ni][nj] > alt) {
						d[ni][nj] = alt;
						que.add(new Obj(ni, nj, alt));
					}
				}
			}
			if (o.j < w - 1) {
				int nj = o.j + 1;
				if (s[ni][nj] == '.') {
					int alt = o.d + 1;
					if (d[ni][nj] > alt) {
						d[ni][nj] = alt;
						que.add(new Obj(ni, nj, alt));
					}
				}
			}
		}

		PrintWriter pw = new PrintWriter(System.out);
		for (int j = 0; j < w; j++) {
			pw.println(d[0][j]);
		}
		pw.flush();
	}

	static class Obj {
		int i, j, d;

		public Obj(int i, int j, int d) {
			this.i = i;
			this.j = j;
			this.d = d;
		}
	}
}
0