# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
126470 |
2019-07-07T19:55:25 Z |
zeyad49 |
OBELISK (NOI14_obelisk) |
Java 11 |
|
1000 ms |
57208 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 TreeMap<pair,Long>memo;
static class pair implements Comparable<pair>
{
int a,b,c;
pair(int x,int y,int z){
a=x;
b=y;
c=z;
}
@Override
public int compareTo(pair o) {
if(a!=o.a)
return a-o.a;
if(b!=o.b)
return b-o.b;
return c-o.c;
}
}
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);
pair p=new pair(floor,i,j);
long x=memo.getOrDefault(p, -1L);
if(x!=-1)
return x;
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));
}
}
}
memo.put(p,ans);
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();
memo=new TreeMap();
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.
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
92 ms |
9904 KB |
Output is correct |
2 |
Correct |
89 ms |
9856 KB |
Output is correct |
3 |
Correct |
90 ms |
9844 KB |
Output is correct |
4 |
Correct |
87 ms |
9876 KB |
Output is correct |
5 |
Correct |
92 ms |
9812 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
136 ms |
11288 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Execution timed out |
1002 ms |
57208 KB |
Time limit exceeded |
2 |
Halted |
0 ms |
0 KB |
- |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Incorrect |
976 ms |
56168 KB |
Output isn't correct |
2 |
Halted |
0 ms |
0 KB |
- |