Submission #230432


Source Code Expand

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;

public class Main {

	public static void main(String[] args) {
		IO io = new IO();
		int n = io.nextInt();
		LCA lca = new LCA(n);
		for(int i=0;i<n-1;i++) {
			int x = io.nextInt()-1;
			int y = io.nextInt()-1;
			lca.addBidirectionalEdge(x, y);
		}
		lca.init();
		int q = io.nextInt();
		for(int i=0;i<q;i++) {
			int a = io.nextInt()-1;
			int b = io.nextInt()-1;
			io.println(lca.dist(a, b) + 1);
		}
		io.flush();
	}

}
class LCA {
	int n;
	ArrayList<Integer>[] tree;
	int[] map;
	RMQ<Node> rmq;
	@SuppressWarnings("unchecked")
	public LCA(int n) {
		this.n = n;
		tree = new ArrayList[n];
		for(int i=0;i<n;i++) {
			tree[i] = new ArrayList<>();
		}
	}
	public void addBidirectionalEdge(int u,int v) {
		tree[u].add(v);
		tree[v].add(u);
	}
	public void init() {
		map = new int[n];
		Arrays.fill(map, -1);
		rmq = new RMQ<Node>(2*n);
		dfs(-1,0,0,0);
	}
	private int dfs(int parent,int v,int count,int level) {
		rmq.update(count, new Node(count,level));
		if (map[v] < 0) {
			map[v] = count;
		}
		count++;
		for(int u:tree[v]) {
			if (u == parent) {
				continue;
			}
			count = dfs(v,u,count,level+1);
			rmq.update(count, new Node(count,level));
			count++;
		}
		return count;
	}
	public Node lca(int u,int v) {
		int u2 = map[u] < map[v] ? map[u] : map[v];
		int v2 = map[u] < map[v] ? map[v] : map[u];
		return rmq.query(u2, v2+1);
	}
	public int dist(int u,int v) {
		int a = rmq.get(map[u]).level;
		int b = rmq.get(map[v]).level;
		int c = lca(u,v).level;
		return Math.abs(a-c)+Math.abs(b-c);
	}
}
class Node implements Comparable<Node>{
	int id;
	int level;
	public Node(int id,int level) {
		this.id = id;
		this.level = level;
	}
	public int compareTo(Node o) {
		return Integer.compare(this.level, o.level);
	}
	public String toString() {
		return "(" + id + "," + level + ")";
	}
	
}
class RMQ<E extends Comparable<E>> {
	private int size;
	private int size_ = 1;
	private ArrayList<E> data;

	public RMQ(int size) {
		this.size = size;
		while(this.size_<this.size) {
			this.size_*=2;
		}
		data = new ArrayList<E>(Collections.nCopies(size_*2-1, (E) null));//[size_*2-1];
	}

	public E get(int k) {
		return data.get(k+size_-1);
	}

	public void update(int k,E a) {
		k+=size_-1;
		data.set(k, a);
		while(k>0) {
			k=(k-1)/2;
			data.set(k, min(data.get(k*2+1),data.get(k*2+2)));
		}
	}

	public E query(int a,int b) {
		return query(a,b,0,0,size_);
	}

	//[a,b)の区間について処理
	//kは接点の番号,[l,r)がkに対応する節点
	private E query(int a,int b,int k,int l,int r) {
		if (r<=a || b<=l) {
			return null;
		}
		if (a<=l && r<=b) {
			return data.get(k);
		}else{
			return min(query(a,b,k*2+1,l,(l+r)/2), query(a,b,k*2+2,(l+r)/2,r));
		}
	}

	//nullはINFとして扱う
	private E min(E a,E b) {
		if (a!=null && b!=null) {
			return a.compareTo(b)<0 ? a : b;
		}else if (a!=null) {
			return a;
		}else{
			return b;
		}
	}
	
	public String toString() {
		return data.subList(size_-1, size+size_).toString();
	}
}
class IO {
	BufferedReader bi = new BufferedReader(new InputStreamReader(System.in));
	StringBuilder out = new StringBuilder();
	int index = 0;
	String bfl = null;
	String[] bf = new String[0];
	private boolean read() {
		try {
			bfl = bi.readLine();
			if (bfl == null) {
				return false;
			}
			bf = bfl.split("\\s");
			index = 0;
		} catch (IOException e) {
			e.printStackTrace();
		}
		return true;
	}
	public boolean hasNext() { return index < bf.length ? true : read(); }
	public boolean hasNextLine() { return read(); }
	public String next() { return hasNext() ? bf[index++] : null; }
	public String nextLine() { return hasNextLine() ? bfl : null; }
	public int nextInt() { return Integer.parseInt(next()); }
	public long nextLong() { return Long.parseLong(next()); }
	public double nextDouble() { return Double.parseDouble(next()); };
	public void print(long x) { out.append(x); }
	public void print(double x) { out.append(x); }
	public void print(String s) { out.append(s); }
	public void println(long x) { out.append(x); out.append("\n"); }
	public void println(double x) { out.append(x); out.append("\n"); }
	public void println(String s) { out.append(s); out.append("\n"); }
	public void flush() {System.out.print(out); out = new StringBuilder(); }
	public int[] arrayInt(int n) {
		int[] a = new int[n];
		for(int i=0;i<n;i++) {
			a[i] = nextInt();
		}
		return a;
	}
	public long[] arrayLong(int n) {
		long[] a = new long[n];
		for(int i=0;i<n;i++) {
			a[i] = nextLong();
		}
		return a;
	}
	public double[] arrayDouble(int n) {
		double[] a = new double[n];
		for(int i=0;i<n;i++) {
			a[i] = nextDouble();
		}
		return a;
	}
}

Submission Info

Submission Time
Task D - 閉路
User piroz95
Language Java (OpenJDK 1.7.0)
Score 100
Code Size 5010 Byte
Status AC
Exec Time 1791 ms
Memory 70688 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 70 / 70
Status
AC × 3
AC × 12
AC × 27
Set Name Test Cases
Sample subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt
Subtask1 subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt
Subtask2 subtask0_sample01.txt, subtask0_sample02.txt, subtask0_sample03.txt, subtask1_01.txt, subtask1_02.txt, subtask1_03.txt, subtask1_04.txt, subtask1_05.txt, subtask1_06.txt, subtask1_07.txt, subtask1_08.txt, subtask1_09.txt, subtask1_10.txt, subtask1_11.txt, subtask1_12.txt, subtask2_01.txt, subtask2_02.txt, subtask2_03.txt, subtask2_04.txt, subtask2_05.txt, subtask2_06.txt, subtask2_07.txt, subtask2_08.txt, subtask2_09.txt, subtask2_10.txt, subtask2_11.txt, subtask2_12.txt
Case Name Status Exec Time Memory
subtask0_sample01.txt AC 456 ms 20984 KB
subtask0_sample02.txt AC 380 ms 21028 KB
subtask0_sample03.txt AC 377 ms 20984 KB
subtask1_01.txt AC 1162 ms 63024 KB
subtask1_02.txt AC 1156 ms 63392 KB
subtask1_03.txt AC 392 ms 21004 KB
subtask1_04.txt AC 376 ms 21032 KB
subtask1_05.txt AC 451 ms 23152 KB
subtask1_06.txt AC 457 ms 23412 KB
subtask1_07.txt AC 1253 ms 51376 KB
subtask1_08.txt AC 1262 ms 50960 KB
subtask1_09.txt AC 1291 ms 52852 KB
subtask1_10.txt AC 1306 ms 54524 KB
subtask1_11.txt AC 1270 ms 51124 KB
subtask1_12.txt AC 1239 ms 51420 KB
subtask2_01.txt AC 1388 ms 70676 KB
subtask2_02.txt AC 1421 ms 70688 KB
subtask2_03.txt AC 944 ms 35328 KB
subtask2_04.txt AC 1013 ms 38336 KB
subtask2_05.txt AC 1141 ms 41220 KB
subtask2_06.txt AC 1116 ms 40020 KB
subtask2_07.txt AC 1699 ms 58648 KB
subtask2_08.txt AC 1791 ms 59692 KB
subtask2_09.txt AC 1789 ms 61992 KB
subtask2_10.txt AC 1709 ms 60556 KB
subtask2_11.txt AC 1664 ms 61132 KB
subtask2_12.txt AC 1690 ms 61412 KB