Submission #230435


Source Code Expand

//木の頂点a,b間の距離がXならば、a,b間をつないだときにできる閉路の長さはX+1になりそう。(だって、aからbまでいって、戻ってくるんだから)
//そうすると、2点間の距離にO(1)とかO(logN)とかで応える必要があるな…… (LCA!!)
//a,b間の距離 = aから根までの距離 + bから根までの距離 - a,bのLCAから根までの距離*2
//しかし、LCA高速処理ってどうやるんだ…(大まかな設計は↑でよい。細かい設計をしよう)
//なお、1番(node[0])を「根」とする。

#include<stdio.h>
#include<iostream>
#include<vector>
#include<queue>
using namespace std;
typedef pair<int,int> PI;

int N;
int x,y;
int Q;
int a,b;

struct NODE{
	vector<int> to;
	int oya;
	int size;
	int dist;
}node[100000];

void BFS( int st )
{
	static queue<PI> que;
	PI now;
	int i;
	que.push( PI(st,0) );
	node[st].oya = st;
	
	while( !que.empty() ){
		now = que.front();
		que.pop();
		if( node[now.first].dist != -1 )
			continue;
		node[now.first].dist = now.second;

		for( i = 0; i < node[now.first].size; i++ ){
			if( node[ node[now.first].to[i] ].oya == -1 ){
				node[ node[now.first].to[i] ].oya = now.first;
				que.push( PI( node[now.first].to[i], now.second+1 ) );
			}
		}
	}
}

//頂点a,bのLCAを求める
int LCA( int a, int b )
{
	if( a == b )
		return a;
	if( node[a].dist > node[b].dist )
		return LCA( node[a].oya, b );
	if( node[b].dist > node[a].dist )
		return LCA( a, node[b].oya );
	if( node[a].dist == node[b].dist )
		return LCA( node[a].oya, node[b].oya );
}

int main()
{
	int i,ans;
	cin >> N;
	
	if( Q > 1 )
		return 0;
		
	for( i = 0; i < N; i++ ){
		node[i].size = 0;
		node[i].dist = -1;
		node[i].oya = -1;
	}
	
	for( i = 0; i < N-1; i++ ){
		cin >> x >> y;x--;y--;
		node[x].to.push_back(y);
		node[y].to.push_back(x);
		node[x].size++;
		node[y].size++;
	}
	
	//node[0]を根としたときの、全頂点-根間の距離を記録
	BFS(0);
	
	cin >> Q;
	for( i = 0; i < Q; i++ ){
		cin >> a >> b;a--;b--;
		ans = node[a].dist + node[b].dist - node[LCA(a,b)].dist*2 + 1;	//なぜか+1しないとWA生える
		cout << ans << endl;
	}
	return 0;
}

Submission Info

Submission Time
Task D - 閉路
User startcpp
Language C++ (G++ 4.6.4)
Score 30
Code Size 2270 Byte
Status TLE
Exec Time 2034 ms
Memory 7980 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 30 / 30 0 / 70
Status
AC × 3
AC × 12
AC × 25
TLE × 2
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 32 ms 4768 KB
subtask0_sample02.txt AC 31 ms 4644 KB
subtask0_sample03.txt AC 31 ms 4640 KB
subtask1_01.txt AC 158 ms 7720 KB
subtask1_02.txt AC 160 ms 7704 KB
subtask1_03.txt AC 31 ms 4640 KB
subtask1_04.txt AC 30 ms 4760 KB
subtask1_05.txt AC 31 ms 4764 KB
subtask1_06.txt AC 31 ms 4760 KB
subtask1_07.txt AC 173 ms 7980 KB
subtask1_08.txt AC 178 ms 7844 KB
subtask1_09.txt AC 184 ms 7840 KB
subtask1_10.txt AC 177 ms 7844 KB
subtask1_11.txt AC 179 ms 7844 KB
subtask1_12.txt AC 177 ms 7848 KB
subtask2_01.txt TLE 2034 ms 7848 KB
subtask2_02.txt TLE 2034 ms 7848 KB
subtask2_03.txt AC 326 ms 4600 KB
subtask2_04.txt AC 347 ms 4644 KB
subtask2_05.txt AC 421 ms 4648 KB
subtask2_06.txt AC 535 ms 4644 KB
subtask2_07.txt AC 614 ms 7968 KB
subtask2_08.txt AC 635 ms 7836 KB
subtask2_09.txt AC 804 ms 7836 KB
subtask2_10.txt AC 1043 ms 7840 KB
subtask2_11.txt AC 1369 ms 7852 KB
subtask2_12.txt AC 1232 ms 7844 KB