結果

問題 No.1013 〇マス進む
ユーザー finefine
提出日時 2020-03-20 23:49:36
言語 C++14
(gcc 12.3.0 + boost 1.83.0)
結果
WA  
実行時間 -
コード長 5,457 bytes
コンパイル時間 2,036 ms
コンパイル使用メモリ 184,108 KB
実行使用メモリ 21,476 KB
最終ジャッジ日時 2024-05-09 09:25:33
合計ジャッジ時間 6,155 ms
ジャッジサーバーID
(参考情報)
judge1 / judge4
このコードへのチャレンジ
(要ログイン)

テストケース

テストケース表示
入力 結果 実行時間
実行使用メモリ
testcase_00 AC 3 ms
8,192 KB
testcase_01 AC 2 ms
8,264 KB
testcase_02 AC 3 ms
8,136 KB
testcase_03 AC 3 ms
8,448 KB
testcase_04 AC 4 ms
8,132 KB
testcase_05 WA -
testcase_06 WA -
testcase_07 WA -
testcase_08 WA -
testcase_09 WA -
testcase_10 WA -
testcase_11 WA -
testcase_12 WA -
testcase_13 AC 4 ms
8,704 KB
testcase_14 AC 31 ms
14,496 KB
testcase_15 AC 50 ms
18,556 KB
testcase_16 AC 47 ms
17,508 KB
testcase_17 AC 27 ms
13,580 KB
testcase_18 AC 34 ms
14,912 KB
testcase_19 WA -
testcase_20 WA -
testcase_21 AC 26 ms
13,160 KB
testcase_22 AC 35 ms
15,048 KB
testcase_23 WA -
testcase_24 WA -
testcase_25 WA -
testcase_26 AC 13 ms
10,308 KB
testcase_27 WA -
testcase_28 WA -
testcase_29 WA -
testcase_30 AC 20 ms
12,416 KB
testcase_31 AC 39 ms
16,224 KB
testcase_32 AC 29 ms
14,240 KB
testcase_33 AC 29 ms
14,240 KB
testcase_34 AC 45 ms
17,892 KB
testcase_35 AC 46 ms
17,268 KB
testcase_36 WA -
testcase_37 WA -
testcase_38 AC 56 ms
18,732 KB
testcase_39 AC 17 ms
11,532 KB
testcase_40 AC 49 ms
17,736 KB
testcase_41 AC 14 ms
10,368 KB
testcase_42 AC 29 ms
14,000 KB
testcase_43 AC 19 ms
11,716 KB
testcase_44 AC 29 ms
14,344 KB
testcase_45 AC 25 ms
13,444 KB
testcase_46 AC 13 ms
10,624 KB
testcase_47 AC 27 ms
13,980 KB
testcase_48 AC 31 ms
14,900 KB
testcase_49 AC 45 ms
17,712 KB
testcase_50 AC 40 ms
16,352 KB
testcase_51 AC 36 ms
15,396 KB
testcase_52 WA -
testcase_53 WA -
testcase_54 AC 43 ms
17,132 KB
testcase_55 AC 15 ms
10,696 KB
testcase_56 AC 58 ms
19,824 KB
testcase_57 AC 42 ms
16,032 KB
testcase_58 AC 71 ms
21,476 KB
testcase_59 AC 79 ms
21,448 KB
testcase_60 AC 67 ms
21,428 KB
testcase_61 WA -
testcase_62 WA -
testcase_63 AC 4 ms
8,192 KB
testcase_64 AC 4 ms
8,192 KB
権限があれば一括ダウンロードができます

ソースコード

diff #

#include <bits/stdc++.h>

using namespace std;

using ll = long long;

const int MAX_V = 100000;

int V;
vector<int> G[MAX_V];
vector<int> rG[MAX_V];
vector<int> vs;
bool used[MAX_V];
int cmp[MAX_V];

void add_edge(int from, int to) {
    G[from].push_back(to);
    rG[to].push_back(from);
}

void dfs(int v) {
    used[v] = true;
    for (int i = 0; i < G[v].size(); i++) {
        if (!used[G[v][i]]) dfs(G[v][i]);
    }
    vs.push_back(v);
}

void rdfs(int v, int k) {
    used[v] = true;
    cmp[v] = k;
    for (int i = 0; i < rG[v].size(); i++) {
        if (!used[rG[v][i]]) rdfs(rG[v][i], k);
    }
}

int scc() {
    memset(used, 0, sizeof(used));
    vs.clear();
    for (int v = 0; v < V; v++) {
        if (!used[v]) dfs(v);
    }
    memset(used, 0, sizeof(used));
    int k = 0;
    for (int i = (int)vs.size() - 1; i >= 0; i--) {
        if (!used[vs[i]]) rdfs(vs[i], k++);
    }
    return k;
}

void dfs_end(int cur, ll rest, const vector< vector<int> >& g, int n, const vector<int>& p, vector<ll>& ans, vector<int>& path) {
    path.push_back(cur);
    for (int prv : g[cur]) {
        if (rest > 0) ans[prv] = ans[cur] - n + prv + 1;
        else ans[prv] = ans[cur] - path[-rest] - 1 + prv + 1;
        dfs_end(prv, rest - 1, g, n, p, ans, path);
    }
    path.pop_back();
}

void dfs_loop(int cur, ll rest, const vector< vector<int> >& g, const int n, const vector<int>& p, vector<ll>& ans, vector<ll>& memo, vector<int>& loop_src, vector<int>& path) {
    if (cur < n) {
        memo[cur] = rest;
        path.push_back(cur);
    }
    for (int prv : g[cur]) {
        if (rest > 0) ans[prv] = (cur == n ? 0 : ans[cur]) + prv + 1;
        else ans[prv] = ans[cur] - path[-rest] - 1 + prv + 1;
        if (cur < n) loop_src[prv] = loop_src[cur];
        dfs_loop(prv, rest - 1, g, n, p, ans, memo, loop_src, path);
    }
    if (cur < n) path.pop_back();
}

int main() {
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
    int n;
    ll K;
    cin >> n >> K;
    vector<int> p(n);
    for (int i = 0; i < n; ++i) {
        cin >> p[i];
        --p[i];
    }

    V = n;
    for (int i = 0; i < n; ++i) {
        if (p[i] + 1 == n) {
            continue;
        }
        add_edge(p[i], p[(i + p[i] + 1) % n]);
    }

    int sz = scc();
    vector<int> cnt(sz, 0);
    for (int i = 0; i < n; ++i) {
        ++cnt[cmp[i]];
    }

    map<int, int> loop_comp_ids;
    for (int i = 0; i < sz; ++i) {
        if (cnt[i] > 1) {
            int hoge = loop_comp_ids.size();
            loop_comp_ids[i] = hoge;
        }
    }
    
    vector< vector<int> > g(n + loop_comp_ids.size());
    for (int i = 0; i < n; ++i) {
        int to;
        if (loop_comp_ids.find(cmp[i]) == loop_comp_ids.end()) {
            to = i;
        } else {
            to = n + loop_comp_ids[cmp[i]];
        }
        for (int j : G[i]) {
            if (cmp[i] == cmp[j]) continue;

            int from;
            if (loop_comp_ids.find(cmp[j]) == loop_comp_ids.end()) {
                from = j;
            } else {
                from = n + loop_comp_ids[cmp[j]];
            }
            g[from].push_back(to);
        }
    }

    vector<ll> ans(n, -1);
    ans[n - 1] = n * K;
    vector<int> path;
    dfs_end(n - 1, K, g, n, p, ans, path);

    vector<ll> memo(n, -1);
    for (auto& foo : loop_comp_ids) {
        int loop_cmp = foo.first;
        vector<int> loops;
        vector<int> dict_loops(n, -1);
        vector<int> loop_src(n, -1);
        for (int i = 0; i < n; ++i) {
            if (cmp[i] == loop_cmp) {
                loop_src[i] = i;
                memo[i] = K;
                ans[i] = 0;
                if (loops.empty()) {
                    int tar = i;
                    while (tar != -1) {
                        dict_loops[tar] = loops.size();
                        loops.push_back(tar);
                        for (int nex : G[tar]) {
                            if (nex == i) {
                                tar = -1;
                                break;
                            } else if (cmp[nex] == cmp[tar]) {
                                tar = nex;
                                break;
                            }
                        }
                    }
                }
                continue;
            }
            for (int j : G[i]) {
                if (cmp[j] == loop_cmp) {
                    loop_src[i] = j;
                    break;
                }
            }
        }

        int loop_size = loops.size();
        vector<ll> sum_loops(2 * loop_size + 1, 0);
        for (int i = 0; i < loop_size; ++i) {
            sum_loops[i + 1] = sum_loops[i] + loops[i] + 1;
        }

        for (int i = 0; i < loop_size; ++i) {
            sum_loops[i + 1 + loop_size] = sum_loops[i + loop_size] + loops[i] + 1;
        }
        
        path.clear();
        dfs_loop(n + foo.second, K, g, n, p, ans, memo, loop_src, path);

        for (int i = 0; i < n; ++i) {
            if (loop_src[i] == -1) continue;
            ll hoge = memo[i] / loop_size * sum_loops[loop_size];
            memo[i] %= loop_size;
            hoge += sum_loops[dict_loops[loop_src[i]] + memo[i]] - sum_loops[dict_loops[loop_src[i]]];
            ans[i] += hoge;
        }
    }

    for (int i = 0; i < n; ++i) {
        /*
        while (ans[p[i]] == -1) {
            volatile int ahaha = 1;
        }*/
        cout << ans[p[i]] + i + 1 << "\n";
    }

    return 0;
}
0