結果

問題 No.168 ものさし
ユーザー uafr_cs
提出日時 2015-09-15 00:28:06
言語 Java
(openjdk 23)
結果
AC  
実行時間 265 ms / 2,000 ms
コード長 2,250 bytes
コンパイル時間 2,471 ms
コンパイル使用メモリ 78,940 KB
実行使用メモリ 45,296 KB
最終ジャッジ日時 2024-12-24 07:11:36
合計ジャッジ時間 7,888 ms
ジャッジサーバーID
(参考情報)
judge2 / judge1
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 4
other AC * 19
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import java.util.Arrays;
import java.util.HashSet;
import java.util.LinkedList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.util.Set;
public class Main {
public static class Node implements Comparable<Node> {
int node;
long max_dist;
public Node(int node, long max_dist){
this.node = node;
this.max_dist = max_dist;
}
@Override
public int compareTo(Node o) {
return Long.compare(this.max_dist, o.max_dist);
}
}
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
final int N = sc.nextInt();
long[] xs = new long[N];
long[] ys = new long[N];
for(int i = 0; i < N; i++){
xs[i] = sc.nextLong();
ys[i] = sc.nextLong();
}
long[] dists = new long[N];
Arrays.fill(dists, Long.MAX_VALUE);
PriorityQueue<Node> queue = new PriorityQueue<Node>();
queue.add(new Node(0, 0));
while(!queue.isEmpty()){
final Node node = queue.poll();
if(dists[node.node] < node.max_dist){
continue;
}else{
dists[node.node] = node.max_dist;
}
if(node.node == N - 1){
long lower = 0, upper = Integer.MAX_VALUE;
while(lower + 1 < upper){
final long mid = (lower + upper) / 2;
final long mid_val = mid * mid;
//System.out.println(upper + " " + lower + " " + mid_val);
if(mid_val >= node.max_dist){
upper = mid;
}else{
lower = mid;
}
}
System.out.println((upper + 9) / 10 * 10);
//System.out.println(node.max_dist);
//System.out.println((int)(Math.floor(Math.sqrt(node.max_dist))));
//System.out.println(((int)(Math.sqrt(node.max_dist)) + 9) / 10 * 10);
break;
}
final long node_x = xs[node.node];
final long node_y = ys[node.node];
for(int next = 0; next < N; next++){
if(node.node == next){ continue; }
final long next_x = xs[next];
final long next_y = ys[next];
final long next_dist = (node_x - next_x) * (node_x - next_x) + (node_y - next_y) * (node_y - next_y);
final long next_max = Math.max(next_dist, node.max_dist);
if(dists[next] <= next_max){
continue;
}else{
dists[next] = next_max;
queue.add(new Node(next, next_max));
}
}
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0