답안 #126468

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
126468 2019-07-07T19:50:46 Z zeyad49 오벨리스크 (NOI14_obelisk) Java 11
5 / 25
1000 ms 37640 KB
	import java.io.*;
	import java.util.*;
	
	public class obelisk {
	
		static 	long MAX=(long)1e9+5;
		static int K,IEND,JEND;
		static long INF=(long)1e18;
		static HashSet<Long>[]holes;
		
		static long dist(int i1,int j1,int i2,int j2) {
			int dx=Math.abs(i1-i2),dy=Math.abs(j1-j2);
			if(K==2) {
				return dx+dy;
			}
			return Math.min(dist(dx,dy), dist(dy,dx));
		}
		
		static long dist(int dx,int dy) {
			if(dy%K!=0)
				return INF;
			long ans=dy/K*2;
			ans+=dx/K*2;
			if(dx%K>0) {
				ans+=dx%K;
				if(dy==0)
					ans+=2;
			}
			return ans;
		}
		static long hash(int i,int j) {
			return i*MAX+j;
		}
		static long dp(int floor,int i,int j) {
			long hash=hash(i,j);
			
			long ans=INF;
			if(floor==0) {
				ans=dist(i, j, IEND, JEND);
			}
			else {
				
				if(holes[floor].contains(hash))
					ans=dp(floor-1,i,j);
				else
				{
					for(long hole:holes[floor]) {
						int i2=(int) (hole/MAX),j2=(int) (hole%MAX);
						ans=Math.min(ans,dp(floor-1,i2,j2)+dist(i, j, i2, j2));
					}
				}
			}
			return ans;
		}
		public static void main(String[] args) throws IOException {
			Scanner sc = new Scanner();
			PrintWriter out = new PrintWriter(System.out);
			int n=sc.nextInt();
			K=sc.nextInt()+1;
			int sx=sc.nextInt(),sy=sc.nextInt();
			IEND=sc.nextInt();
			JEND=sc.nextInt();
			
			holes=new HashSet[n];
			for(int floor=n-1;floor>0;floor--) {
				int h=sc.nextInt();
				holes[floor]=new HashSet();
				while(h-->0) {
					int i=sc.nextInt(),j=sc.nextInt();
					long x=hash(i,j);
					
					holes[floor].add(x);
				}
			}
			long ans=dp(n-1, sx, sy);
			out.print(ans>=INF?-1:ans);
			out.close();
	
		}
	
		
	
		static class Scanner {
			BufferedReader br;
			StringTokenizer st;
	
			Scanner() {
				br = new BufferedReader(new InputStreamReader(System.in));
			}
	
			Scanner(String fileName) throws FileNotFoundException {
				br = new BufferedReader(new FileReader(fileName));
			}
	
			String next() throws IOException {
				while (st == null || !st.hasMoreTokens())
					st = new StringTokenizer(br.readLine());
				return st.nextToken();
			}
	
			String nextLine() throws IOException {
				return br.readLine();
			}
	
			int nextInt() throws IOException {
				return Integer.parseInt(next());
			}
	
			long nextLong() throws NumberFormatException, IOException {
				return Long.parseLong(next());
			}
	
			double nextDouble() throws NumberFormatException, IOException {
				return Double.parseDouble(next());
			}
	
			boolean ready() throws IOException {
				return br.ready();
			}
	
		}
	
	}

Compilation message

Note: obelisk.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
# 결과 실행 시간 메모리 Grader output
1 Correct 336 ms 19792 KB Output is correct
2 Correct 424 ms 32916 KB Output is correct
3 Correct 215 ms 19536 KB Output is correct
4 Correct 133 ms 13820 KB Output is correct
5 Correct 298 ms 37640 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1012 ms 17720 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1056 ms 25748 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 1049 ms 26828 KB Time limit exceeded
2 Halted 0 ms 0 KB -