Submission #230708


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));

                // 交差点の履歴を覚える
                routes[e.to] = routes[v];

                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()) {

            if (route_a[idx].first  == route_b[idx].first) {
                common = route_a[idx];
                a_last = route_a[idx];
                b_last = route_b[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 3241 Byte
Status MLE
Exec Time 1506 ms
Memory 264864 KB

Judge Result

Set Name Sample Subtask1 Subtask2
Score / Max Score 0 / 0 0 / 30 0 / 70
Status
AC × 3
AC × 11
MLE × 1
AC × 25
MLE × 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 25 ms 672 KB
subtask0_sample02.txt AC 24 ms 924 KB
subtask0_sample03.txt AC 23 ms 924 KB
subtask1_01.txt AC 177 ms 12068 KB
subtask1_02.txt AC 176 ms 12072 KB
subtask1_03.txt AC 24 ms 672 KB
subtask1_04.txt AC 22 ms 932 KB
subtask1_05.txt AC 27 ms 1248 KB
subtask1_06.txt AC 28 ms 1956 KB
subtask1_07.txt AC 311 ms 39080 KB
subtask1_08.txt AC 291 ms 31780 KB
subtask1_09.txt AC 464 ms 106656 KB
subtask1_10.txt AC 684 ms 213412 KB
subtask1_11.txt MLE 791 ms 264864 KB
subtask1_12.txt AC 627 ms 182896 KB
subtask2_01.txt AC 541 ms 12128 KB
subtask2_02.txt AC 647 ms 12064 KB
subtask2_03.txt AC 428 ms 924 KB
subtask2_04.txt AC 454 ms 924 KB
subtask2_05.txt AC 531 ms 1312 KB
subtask2_06.txt AC 588 ms 1828 KB
subtask2_07.txt AC 810 ms 39072 KB
subtask2_08.txt AC 815 ms 31832 KB
subtask2_09.txt AC 1052 ms 106656 KB
subtask2_10.txt AC 1355 ms 213396 KB
subtask2_11.txt MLE 1506 ms 264864 KB
subtask2_12.txt AC 1354 ms 182948 KB