# |
Submission time |
Handle |
Problem |
Language |
Result |
Execution time |
Memory |
377066 |
2021-03-12T22:52:24 Z |
timg8710 |
Valley (BOI19_valley) |
Java 11 |
|
1396 ms |
66600 KB |
// package olypmiads;
import java.io.*;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.StringTokenizer;
@SuppressWarnings("unchecked")
public class valley {
//1. root tree at exit
//2. Use pref sum idea: pref[i] is the sum from root to i
//pref[u] + pref[shop] - 2*pref[lca(sum, u)]
//like many formulations involving LCA, we don't have to worry about it if we use offline processing, reduce the problem to a linear array as the DFS
//is in progress
static int[][] edges;
static long[] ret;
static int[] map;
static long[] dp;
static ArrayList<int[]>[] upQ;
static ArrayList<long[]>[] adj;
static long NEG = Long.MAX_VALUE/3;
public static void main(String[] args) throws IOException {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
PrintWriter pw = new PrintWriter(System.out);
StringTokenizer st = new StringTokenizer(br.readLine());
int N = Integer.parseInt(st.nextToken());
int S = Integer.parseInt(st.nextToken()); int Q = Integer.parseInt(st.nextToken()); int E = Integer.parseInt(st.nextToken())-1;
ret = new long[Q];
edges = new int[N-1][2];
upQ = new ArrayList[N]; for(int i= 0; i<upQ.length; i++) upQ[i] = new ArrayList<>();
//for offline processing
adj = new ArrayList[N]; for (int i = 0; i < adj.length; i++) { adj[i] = new ArrayList<>();}
for(int i = 0; i<N-1; i++) {
st = new StringTokenizer(br.readLine());
int u = Integer.parseInt(st.nextToken())-1; int v = Integer.parseInt(st.nextToken())-1; long w = Integer.parseInt(st.nextToken());
adj[u].add(new long[]{v, w}); adj[v].add(new long[]{u, w});
edges[i] = new int[]{u, v};
}
dp = new long[N]; //this is the dp of the lcas
Arrays.fill(dp, NEG);
for(int i = 0; i<S; i++){
dp[Integer.parseInt(br.readLine())-1] = 0;
}
precomp(E, -1, 0);
// System.out.println(Arrays.toString(dp));
for(int i =0; i<Q; i++){
st = new StringTokenizer(br.readLine());
int e = Integer.parseInt(st.nextToken())-1; int u = Integer.parseInt(st.nextToken())-1;
upQ[u].add(new int[]{edges[e][0], edges[e][1], i});
}
SegTree pref = new SegTree(N);
map = new int[N]; //mapping to in the pref ar
Arrays.fill(map, -1);
dfs(E, -1, 0, pref, 0);
for(long i : ret) pw.println(i == -1 ? "escaped" : (i >= NEG ? "oo" : ""+i));
pw.close();
br.close();
}
static void dfs(int u, int par, int idx, SegTree pref, long sum){
map[u] = idx;
pref.update(1, idx, dp[u], 0, adj.length-1);
for(int[] e : upQ[u]){
int block = Math.min(map[e[0]], map[e[1]]);
if(block == -1){
ret[e[2]] = -1;
}else{
ret[e[2]] = sum + pref.get(1, block+1, idx, 0, adj.length-1);
}
}
for(long[] n : adj[u]){
if(n[0] != par) dfs((int)n[0], u, idx+1, pref, sum + n[1]);
}
map[u] = -1;
pref.update(1, idx, -dp[u], 0, adj.length-1);
}
static long precomp(int u, int par, long sum){
for(long[] n : adj[u]){
if(n[0] == par) continue;
dp[u] = Math.min(dp[u], precomp((int)n[0], u, sum + n[1]) + n[1]);
}
dp[u] -= sum;
return dp[u] + sum;
}
static class SegTree {
public long[] nodes;
public SegTree(int N) {
nodes = new long[4 * N];
}
public long get(int gI, int l, int r, int gL, int gR) {
if (l > r) {
return NEG;
}
if (gL == l && gR == r) {
return nodes[gI];
}
int mid = (gR + gL) / 2;
return Math.min(
get(2 * gI, l, Math.min(r, mid), gL, mid),
get(2 * gI + 1, Math.max(mid + 1, l), r, mid + 1, gR)
);
}
public long update(int gI, int idx, long val, int gL, int gR) {
if (idx < gL || idx > gR) {
return nodes[gI];
}
if (gL == gR) {
nodes[gI] = val;
} else {
nodes[gI] = Math.min(
update(2 * gI, idx, val, gL, (gL + gR) / 2),
update(2 * gI + 1, idx, val, (gL + gR) / 2 + 1, gR)
);
}
return nodes[gI];
}
}
}
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
497 ms |
15192 KB |
Output is correct |
2 |
Correct |
505 ms |
15036 KB |
Output is correct |
3 |
Correct |
474 ms |
15320 KB |
Output is correct |
4 |
Correct |
482 ms |
15352 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
497 ms |
15192 KB |
Output is correct |
2 |
Correct |
505 ms |
15036 KB |
Output is correct |
3 |
Correct |
474 ms |
15320 KB |
Output is correct |
4 |
Correct |
482 ms |
15352 KB |
Output is correct |
5 |
Correct |
289 ms |
15132 KB |
Output is correct |
6 |
Correct |
330 ms |
14948 KB |
Output is correct |
7 |
Correct |
284 ms |
14816 KB |
Output is correct |
8 |
Correct |
289 ms |
15056 KB |
Output is correct |
9 |
Correct |
330 ms |
15256 KB |
Output is correct |
10 |
Correct |
288 ms |
14816 KB |
Output is correct |
11 |
Correct |
297 ms |
15200 KB |
Output is correct |
12 |
Correct |
305 ms |
15056 KB |
Output is correct |
13 |
Correct |
279 ms |
14944 KB |
Output is correct |
14 |
Correct |
306 ms |
14948 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
1248 ms |
58540 KB |
Output is correct |
2 |
Correct |
1396 ms |
66600 KB |
Output is correct |
3 |
Correct |
1235 ms |
62372 KB |
Output is correct |
4 |
Correct |
1300 ms |
65984 KB |
Output is correct |
5 |
Correct |
1249 ms |
60644 KB |
Output is correct |
6 |
Correct |
1290 ms |
65104 KB |
Output is correct |
# |
Verdict |
Execution time |
Memory |
Grader output |
1 |
Correct |
497 ms |
15192 KB |
Output is correct |
2 |
Correct |
505 ms |
15036 KB |
Output is correct |
3 |
Correct |
474 ms |
15320 KB |
Output is correct |
4 |
Correct |
482 ms |
15352 KB |
Output is correct |
5 |
Correct |
289 ms |
15132 KB |
Output is correct |
6 |
Correct |
330 ms |
14948 KB |
Output is correct |
7 |
Correct |
284 ms |
14816 KB |
Output is correct |
8 |
Correct |
289 ms |
15056 KB |
Output is correct |
9 |
Correct |
330 ms |
15256 KB |
Output is correct |
10 |
Correct |
288 ms |
14816 KB |
Output is correct |
11 |
Correct |
297 ms |
15200 KB |
Output is correct |
12 |
Correct |
305 ms |
15056 KB |
Output is correct |
13 |
Correct |
279 ms |
14944 KB |
Output is correct |
14 |
Correct |
306 ms |
14948 KB |
Output is correct |
15 |
Correct |
1248 ms |
58540 KB |
Output is correct |
16 |
Correct |
1396 ms |
66600 KB |
Output is correct |
17 |
Correct |
1235 ms |
62372 KB |
Output is correct |
18 |
Correct |
1300 ms |
65984 KB |
Output is correct |
19 |
Correct |
1249 ms |
60644 KB |
Output is correct |
20 |
Correct |
1290 ms |
65104 KB |
Output is correct |
21 |
Correct |
1223 ms |
60560 KB |
Output is correct |
22 |
Correct |
1195 ms |
61096 KB |
Output is correct |
23 |
Correct |
1198 ms |
60716 KB |
Output is correct |
24 |
Correct |
1229 ms |
64028 KB |
Output is correct |
25 |
Correct |
1266 ms |
65100 KB |
Output is correct |
26 |
Correct |
1243 ms |
60604 KB |
Output is correct |
27 |
Correct |
1251 ms |
61120 KB |
Output is correct |
28 |
Correct |
1247 ms |
61396 KB |
Output is correct |
29 |
Correct |
1283 ms |
63084 KB |
Output is correct |
30 |
Correct |
1293 ms |
63108 KB |
Output is correct |
31 |
Correct |
1251 ms |
60672 KB |
Output is correct |
32 |
Correct |
1264 ms |
61212 KB |
Output is correct |
33 |
Correct |
1232 ms |
60540 KB |
Output is correct |
34 |
Correct |
1307 ms |
63912 KB |
Output is correct |
35 |
Correct |
1273 ms |
64440 KB |
Output is correct |
36 |
Correct |
1313 ms |
62468 KB |
Output is correct |