結果

問題 No.2337 Equidistant
ユーザー ks2m
提出日時 2023-06-02 22:05:37
言語 Java
(openjdk 23)
結果
WA  
実行時間 -
コード長 2,800 bytes
コンパイル時間 7,716 ms
コンパイル使用メモリ 78,584 KB
実行使用メモリ 128,892 KB
最終ジャッジ日時 2024-12-28 18:11:39
合計ジャッジ時間 44,643 ms
ジャッジサーバーID
(参考情報)
judge4 / judge2
このコードへのチャレンジ
(要ログイン)
ファイルパターン 結果
sample AC * 1
other AC * 3 WA * 25
権限があれば一括ダウンロードができます

ソースコード

diff #
プレゼンテーションモードにする

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class Main {
public static void main(String[] args) throws Exception {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
String[] sa = br.readLine().split(" ");
int n = Integer.parseInt(sa[0]);
int q = Integer.parseInt(sa[1]);
List<List<Integer>> list = new ArrayList<>(n);
for (int i = 0; i < n; i++) {
list.add(new ArrayList<>());
}
for (int i = 0; i < n - 1; i++) {
sa = br.readLine().split(" ");
int a = Integer.parseInt(sa[0]) - 1;
int b = Integer.parseInt(sa[1]) - 1;
list.get(a).add(b);
list.get(b).add(a);
}
DoublingLCA dl = new DoublingLCA(list, 0);
PrintWriter pw = new PrintWriter(System.out);
for (int i = 0; i < q; i++) {
sa = br.readLine().split(" ");
int s = Integer.parseInt(sa[0]) - 1;
int t = Integer.parseInt(sa[1]) - 1;
DoublingLCA.Node lca = dl.lca(s, t);
int d = dl.nodes[s].dep + dl.nodes[t].dep - lca.dep * 2;
if (d % 2 == 0) {
pw.println(1);
} else {
pw.println(0);
}
}
pw.flush();
br.close();
}
static class DoublingLCA {
int n, h = 1, root;
List<List<Integer>> list;
Node[] nodes;
int[][] parent;
/**
*
* @param list
* @param root
*/
public DoublingLCA(List<List<Integer>> list, int root) {
n = list.size();
this.root = root;
this.list = list;
while ((1 << h) < n) {
h++;
}
nodes = new Node[n];
for (int i = 0; i < n; i++) {
nodes[i] = new Node(i, -1);
}
parent = new int[h][n];
for (int i = 0; i < h; i++) {
Arrays.fill(parent[i], -1);
}
dfs(root, -1, 0);
for (int i = 0; i < h - 1; i++) {
for (int j = 0; j < n; j++) {
if (parent[i][j] != -1) {
parent[i + 1][j] = parent[i][parent[i][j]];
}
}
}
}
private void dfs(int x, int p, int dep) {
parent[0][x] = p;
nodes[x].dep = dep;
for (int next : list.get(x)) {
if (next != p) {
dfs(next, x, dep + 1);
}
}
}
/**
* A,BLCA0≦A,BN
*/
public Node lca(int a, int b) {
int u = a;
int v = b;
if (nodes[u].dep < nodes[v].dep) {
u = b;
v = a;
}
for (int i = 0; i < h; i++) {
if ((nodes[u].dep - nodes[v].dep >> i & 1) == 1) {
u = parent[i][u];
}
}
if (u == v) {
return nodes[u];
}
for (int i = h - 1; i >= 0; i--) {
if (parent[i][u] != parent[i][v]) {
u = parent[i][u];
v = parent[i][v];
}
}
return nodes[parent[0][u]];
}
public static class Node {
int i, dep;
public Node(int i, int dep) {
this.i = i;
this.dep = dep;
}
}
}
}
הההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההההה
XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
0