Submission #306368

#TimeUsernameProblemLanguageResultExecution timeMemory
306368llakiStations (IOI20_stations)Java
5 / 100
1608 ms40536 KiB
import java.util.ArrayList; public class stations { void dfsLabel(int v, int p, ArrayList<Integer>[] G, int[] labels) { int min = label; for (int to : G[v]) { if (p != to) { dfsLabel(to, v, G, labels); } } int max = label; labels[v] = 1000 * min + max; label++; } int label = 0; int[] label(int n, int k, int[] u, int[] v) { ArrayList<Integer>[] G = new ArrayList[n]; for (int i = 0; i < G.length; i++) { G[i] = new ArrayList<>(); } for (int i = 0; i < u.length; i++) { G[u[i]].add(v[i]); G[v[i]].add(u[i]); } int[] labels = new int[n]; if (k > 1000) { label = 0; dfsLabel(0, 0, G, labels); return labels; } boolean allTask2 = true; for (int i = 0; i < n - 1; i++) { if (u[i] == i + 1 && v[i] == i / 2) { continue; } if (v[i] == i + 1 && u[i] == i / 2) { continue; } allTask2 = false; break; } int maxSize = 0; for (int i = 0; i < n; i++) { maxSize = Math.max(maxSize, G[i].size()); } if (allTask2 && maxSize > 2) { for (int i = 0; i < n; i++) { labels[i] = i; } return labels; } int leaf = -1; for (int i = 0; i < n; i++) { if (G[i].size() == 1) { leaf = i; break; } } int cur = 0; int node = leaf; int prev = -1; while (true) { labels[node] = cur; cur++; boolean found = false; for (int to : G[node]) { if (to == prev) continue; prev = node; node = to; found = true; break; } if (!found) break; } return labels; } boolean isAncestor(int a, int b) { if (a == b) return true; while (a > 0) { a = (a - 1) / 2; if (a == b) return true; } return false; } int find_next_station(int s, int t, int[] c) { boolean isLarge = false; if (s >= 1000 || t >= 1000) isLarge = true; for (int nd : c) if (nd >= 1000) isLarge = true; boolean isTask2 = true; for (int nd : c) { if (nd != s / 2 && nd != 2 * s + 1 && nd != 2 * s + 2) isTask2 = false; } if (isLarge || !isTask2) { int dest = t % 1000; for (int nd : c) { if (nd % 1000 > s % 1000) continue; int min = nd / 1000, max = nd % 1000; if (min <= dest && dest <= max) { return nd; } } for (int nd : c) { if (nd % 1000 > s % 1000) return nd; } } boolean isBamboo = true; if (c.length > 2) { isBamboo = false; } else { for (int nd : c) { if (Math.abs(nd - s) > 1) isBamboo = false; } } if (!isBamboo) { if (!isAncestor(t, s)) { return (s - 1) / 2; } for (int nd : c) { if (nd < s) continue; if (isAncestor(t, nd)) { return nd; } } } else { for (int nd : c) { if (s <= nd && nd <= t) return nd; if (s >= nd && nd >= t) return nd; } } return -1; } }

Compilation message (stderr)

Note: stations.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...