제출 #265122

#제출 시각아이디문제언어결과실행 시간메모리
265122idk321Sky Walking (IOI19_walk)Java
0 / 100
4646 ms227108 KiB
import java.util.*;

class walk {
    int n;
    int m;
    int count;
    ArrayList<int[]>[] adj;

	public long min_distance(int[] x, int[] h, int[] l, int[] r, int[] y, int s, int g) {
		n = x.length;
		m = l.length;
        TreeSet<Building> buildings = new TreeSet<Building>();
        for (int i = 0; i < n; i++) {
            Building building = new Building(i, x[i], h[i]);
            buildings.add(building);
        }
        count = n;

        adj = new ArrayList[2000000];
        for (int i = 0; i < adj.length; i++) adj[i] = new ArrayList<int[]>();

        int[][] buildingHeights = new int[n][2];
        int[][] walkHeights = new int[m][2];
        for (int i = 0; i < n; i++) {
            buildingHeights[i][0] = i;
            buildingHeights[i][1] = h[i];
        }
        for (int i = 0; i < m; i++) {
            walkHeights[i][0] = i;
            walkHeights[i][1] = y[i];
        }
        Arrays.sort(buildingHeights, new ArrayComparator());
        Arrays.sort(walkHeights, new ArrayComparator());
        int currentWalk = 0;
        int currentBuilding = 0;
        int[][] coords = new int[adj.length][2];
        while (currentWalk < m) {
            while (buildingHeights[currentBuilding][1] < walkHeights[currentWalk][1]) {
                int index = buildingHeights[currentBuilding][0];
                buildings.remove(new Building(index, x[index], h[index]));
                currentBuilding++;
            }
            int walkIndex = walkHeights[currentWalk][0];
            Set<Building> tailSet = buildings.tailSet(new Building(-1, x[l[walkIndex]], y[walkIndex]), true);
            int prevX = -1;
            for (Building b : tailSet) {
                int[] coord = {b.x, walkHeights[currentWalk][1]};
                coords[count] = coord;
                if (b.x > x[r[walkIndex]]) break;
                for (int[] adjacent : adj[b.index]) {
                    int dist2 = adjacent[1];
                    int[] ar1 = {adjacent[0], Math.abs(dist2 - y[walkIndex])};
                    int[] ar2 = {count, Math.abs(dist2 - y[walkIndex])};
                    adj[count].add(ar1);
                    adj[adjacent[0]].add(ar2);
                }
                int[] ar1 = {b.index, y[walkIndex]};
                int[] ar2 = {count, y[walkIndex]};
                adj[count].add(ar1);
                adj[b.index].add(ar2);

                if (b.x != x[l[walkIndex]]) {
                    int dist = x[b.index] - prevX;
                    int[] ar3 = {count, dist};
                    int[] ar4 = {count - 1, dist};
                    adj[count - 1].add(ar3);
                    adj[count].add(ar4);
                }
                count++;
                prevX = b.x;
            }

            currentWalk++;
        }

        long[] shortestDistance = new long[adj.length];
        Arrays.fill(shortestDistance, Long.MAX_VALUE);
        PriorityQueue<long[]> pq = new PriorityQueue<long[]>(new ArrayComparator2());
        long[] ar1 = {s, 0};
        pq.add(ar1);
        while (!pq.isEmpty()) {
            long[] node = pq.remove();
            int index = (int) node[0];
            //System.out.println(node[0] + " " + adj[index].size());
            if (node[1] >= shortestDistance[index]) continue;
            shortestDistance[index] = node[1];

            for (int[] adjacent : adj[index]) {
                if (shortestDistance[adjacent[0]] == Long.MAX_VALUE) {
                    long[] ar = {adjacent[0], adjacent[1] + shortestDistance[index]};
                    pq.add(ar);
                }
            }
        }

        return shortestDistance[g];
	}

	private static class ArrayComparator implements Comparator<int[]> {
        @Override
        public int compare(int[] o1, int[] o2) {
            return Integer.compare(o1[1], o2[1]);
        }
    }

    private static class ArrayComparator2 implements Comparator<long[]> {
        @Override
        public int compare(long[] o1, long[] o2) {
            return Long.compare(o1[1], o2[1]);
        }
    }

	private static class Building implements Comparable<Building> {
	    int index;
	    int x;
	    int h;

        public Building(int index, int x, int h) {
            this.index = index;
            this.x = x;
            this.h = h;
        }

        @Override
        public int compareTo(Building o) {
            int compare1 = Integer.compare(x, o.x);
            if (compare1 != 0) return compare1;
            return Integer.compare(h, o.h);
        }
    }
}

컴파일 시 표준 에러 (stderr) 메시지

Note: walk.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...