Submission #230650


Source Code Expand

#include <iostream>
#include <sstream>
#include <string>
#include <cmath>
#include <cstdio>
#include <vector>
#include <map>
#include <set>
#include <queue>
#include <deque>
#include <algorithm>
#include <functional>
#include <numeric>

using namespace std;
typedef unsigned int uint;
typedef long long ll;
typedef unsigned long long ull;

#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
#define FOR(i,a,b) for(int i = (a); i < (int)(b); ++i)
#define FOREACH(i, n) for (__typeof((n).begin()) i = (n).begin(); i != (n).end(); ++i)
#define ALL(c) (c).begin(), (c).end()
#define SIZE(v) ((int)v.size())

#define pb push_back
#define mp make_pair

#define REP(i,n) for(int i = 0; i < (int)(n); ++i)
using namespace std;

// edge生成用
struct edge_element { int from, to, cost; };
struct edge { int to, cost; };
typedef pair<int, int> P; // <最短距離, 頂点番号>

const int INF = 1e9;


int V;
vector<vector<pair<int, int>>> routes(V + 1);


// 頂点sから各頂点までの距離を計算してdに格納
void dijkstra(int s, vector<vector<edge> >& G, vector<int>& d)
{
    priority_queue<P, vector<P>, greater<P> > que;
    fill(ALL(d), INF);
    d[s] = 0;
    que.push(P(0, s));

    while (!que.empty()) {
        P p = que.top();
        que.pop();

        int dist = p.first;
        int v = p.second;
        if (d[v] < dist) continue;
        REP(i, G[v].size()) {
            edge e = G[v][i];

            if (d[e.to] > d[v] + e.cost) {
                d[e.to] = d[v] + e.cost;
                que.push(P(d[e.to], e.to));

                // 交差点に来たらそれを覚えとく
                if (v == s || G[v].size() > 2) {
                    routes[e.to].pb( mp(v, i) );
                }
            }
        }
    }
}


int main(){
    cin >> V;

    routes.resize(V + 1);

    vector<vector<edge>> G(V + 1);
    REP(v, V-1) {
        int x, y;
        cin >> x >> y;

        edge tmp1{ y, 1 };
        edge tmp2{ x, 1 };
        G[x].pb(tmp1);
        G[y].pb(tmp2);
    }

    vector<int> d(V + 1);

    dijkstra(1, G, d);

    int Q;
    cin >> Q;
    REP(q,Q){
        int a, b;
        cin >> a >> b;

        // 共通の祖先を探す
        auto route_a = routes[a];
        auto route_b = routes[b];
        auto common = mp(1, -1);

        pair<int, int> a_last = common;
        pair<int, int> b_last = common;

        int idx = 0;
        while (idx < route_a.size() && idx < route_b.size()) {
            a_last = route_a[idx];
            b_last = route_b[idx];

            if (route_a[idx].first  == route_b[idx].first) {
                common = route_a[idx];
            }
            else break;
            ++idx;
        }

        int ret = 0;
        // 祖先と、その行き先が完全一致する場合
        if (a_last == b_last) {
            ret = abs(d[a] - d[b]) + 1;
        }
        else
        {
            int d1 = d[a] - d[common.first];
            int d2 = d[b] - d[common.first];
            ret = d1 + d2 + 1;
        }

        cout << ret << endl;
    }

    return 0;
}

Submission Info

Submission Time
Task D - 閉路
User minus9d
Language C++11 (GCC 4.8.1)
Score 0
Code Size 3200 Byte
Status WA
Exec Time 699 ms
Memory 11936 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 0 / 30 0 / 70
Status
AC × 2
WA × 1
AC × 4
WA × 8
AC × 8
WA × 19
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 WA 24 ms 916 KB
subtask0_sample02.txt AC 25 ms 792 KB
subtask0_sample03.txt AC 27 ms 764 KB
subtask1_01.txt AC 163 ms 8988 KB
subtask1_02.txt AC 163 ms 8996 KB
subtask1_03.txt AC 24 ms 920 KB
subtask1_04.txt WA 25 ms 728 KB
subtask1_05.txt WA 26 ms 916 KB
subtask1_06.txt AC 27 ms 860 KB
subtask1_07.txt WA 211 ms 11928 KB
subtask1_08.txt WA 208 ms 11560 KB
subtask1_09.txt WA 209 ms 11356 KB
subtask1_10.txt WA 208 ms 11424 KB
subtask1_11.txt WA 210 ms 11420 KB
subtask1_12.txt WA 203 ms 11416 KB
subtask2_01.txt AC 522 ms 8992 KB
subtask2_02.txt AC 534 ms 8992 KB
subtask2_03.txt WA 337 ms 916 KB
subtask2_04.txt WA 444 ms 928 KB
subtask2_05.txt WA 458 ms 928 KB
subtask2_06.txt WA 474 ms 928 KB
subtask2_07.txt WA 693 ms 11936 KB
subtask2_08.txt WA 692 ms 11620 KB
subtask2_09.txt WA 699 ms 11428 KB
subtask2_10.txt WA 696 ms 11424 KB
subtask2_11.txt WA 686 ms 11428 KB
subtask2_12.txt WA 611 ms 11424 KB