提出 #52141008


ソースコード 拡げる

// Hallelujah, praise the one who set me free
// Hallelujah, death has lost its grip on me
// You have broken every chain, There's salvation in your name
// Jesus Christ, my living hope
#include <bits/stdc++.h> 
#include "Aoi.h"
using namespace std;

#define REP(i, s, e) for (int i = (s); i < (e); i++)
#define RREP(i, s, e) for (int i = (s); i >= (e); i--)
template <class T>
inline bool mnto(T& a, T b) {return a > b ? a = b, 1 : 0;}
template <class T>
inline bool mxto(T& a, T b) {return a < b ? a = b, 1: 0;}

typedef unsigned long long ull;
typedef long long ll;
typedef long double ld;
#define FI first
#define SE second
typedef pair<int, int> ii;
typedef pair<ll, ll> pll;
typedef tuple<int, int, int> iii;
#define ALL(_a) _a.begin(), _a.end()
#define SZ(_a) (int) _a.size()
#define pb push_back
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<ii> vii;
typedef vector<iii> viii;

#ifndef DEBUG
#define cerr if (0) cerr
#endif

const int INF = 1000000005;
const ll LINF = 1000000000000000005ll;
const int MAXN = 10005;
const int MAXM = 20005;
const int MAXK = 305;
const int LOGK = 9;
const int MAXQ = 16;
const int LOGQ = 4;

namespace {
    int n, m, q, k;
    ll c[MAXM];
    vii adj[MAXN];
    int subt[MAXN], tid[MAXN], bid[MAXM];
    vii tree[MAXN];

    string s;
    bool bvis[MAXK];
    int bl[MAXK];
    bool tdone[MAXQ + 5];

    int qptr;
    ii p[MAXN], tp[MAXN];

    vector<vector<int>> decode(int b, vector<int> k, vector<int> l, vector<int> x) {
        assert(k.size() == l.size());
        int n = k.size(), m = x.size();
        vector<vector<int>> a(n);
        for (int i = 0; i < n; i++) {
            a[i].resize(l[i]);
            for (int j = 0; j < l[i]; j++) {
                int rem = 0;
                for (int p = m - 1; p >= 0; p--) {
                    rem = rem * b + x[p];
                    x[p] = rem / k[i];
                    rem %= k[i];
                }
                a[i][j] = rem;
            }
        }
        return a;
    }


    ll d[MAXN];
    priority_queue<pll, vector<pll>, greater<pll>> pq;
    void dijkstra(int s) {
        REP (i, 0, n) {
            d[i] = LINF;
        }
        d[s] = 0;
        pq.push({0, s});
        while (!pq.empty()) {
            auto [ud, u] = pq.top(); pq.pop();
            if (ud != d[u]) {
                continue;
            }
            for (auto [v, i] : adj[u]) {
                if (mnto(d[v], d[u] + c[i])) {
                    p[v] = {u, i};
                    pq.push({d[v], v});
                }
            }
        }
    }

    void root(int u) {
        for (auto [v, i] : tree[u]) {
            root(v);
            subt[u] += subt[v];
        }
    }
    vi badj[MAXK];
    vi bt[MAXK];
    vi stk;
    void dfs(int u) {
        if (tid[u] < q) {
            bt[stk.back()].pb(tid[u]);
        }
        for (auto [v, i] : tree[u]) {
            if (!subt[v]) {
                continue;
            }
            if (bid[i] < k) {
                badj[stk.back()].pb(bid[i]);
                stk.pb(bid[i]);
            }
            dfs(v);
            if (bid[i] < k) {
                stk.pop_back();
            }
        }
    }
    int bmnt[MAXK];
    void broot(int u) {
        bmnt[u] = INF;
        if (!bt[u].empty()) {
            sort(ALL(bt[u]));
            bmnt[u] = bt[u][0];
        }
        for (int v : badj[u]) {
            broot(v);
            mnto(bmnt[u], bmnt[v]);
        }
        sort(ALL(badj[u]), [&] (int l, int r) {
                return bmnt[l] < bmnt[r];
                });
    }
    int lptr;
    int tlabel[MAXQ + 5], blabel[MAXK];
    int ids[MAXQ + 5];
    int bdfs(int u) {
        int ptr = 0;
        int nxt = -1;
        blabel[u] = lptr;
        for (int v : badj[u]) {
            while (ptr < SZ(bt[u]) && bt[u][ptr] < bmnt[v]) {
                tlabel[nxt] = u;
                ids[lptr] = bt[u][ptr];
                nxt = bt[u][ptr++];
                lptr++;
            }
            tlabel[nxt] = u;
            nxt = bdfs(v);
        }
        while (ptr < SZ(bt[u])) {
            tlabel[nxt] = u;
            ids[lptr] = bt[u][ptr];
            nxt = bt[u][ptr++];
            lptr++;
        }
        return nxt;
    }
    vector<int> encode(int b, vector<int> k, vector<vector<int>> a) {
        assert(k.size() == a.size());
        int n = k.size();
        ld bits = 0;
        for (int i = 0; i < n; i++) {
            bits += a[i].size() * (log(k[i]) / log(b));
        }
        int m = ceil(bits);
        vector<int> x(m);
        for (int p = 0; p < m; p++) {
            int rem = 0;
            for (int i = n - 1; i >= 0; i--) {
                for (int j = a[i].size() - 1; j >= 0; j--) {
                    rem = rem * k[i] + a[i][j];
                    a[i][j] = rem / b;
                    rem %= b;
                }
            }
            x[p] = rem;
        }
        return x;
    }
}

string aoi(int N, int M, int Q, int K, vi A, vi B, vll C, vi T, vi X) {
    n = N; m = M; q = Q; k = K;
    REP (i, 0, m) {
        adj[A[i]].pb({B[i], i});
        adj[B[i]].pb({A[i], i});
        c[i] = C[i];
    }
    REP (i, 0, n) {
        tid[i] = INF;
    }
    REP (i, 0, q) {
        subt[T[i]] = 1;
        tid[T[i]] = i;
    }
    REP (i, 0, m) {
        bid[i] = INF;
    }
    REP (i, 0, k) {
        bid[X[i]] = i;
        blabel[i] = q;
    }
    dijkstra(0);
    REP (i, 1, n) {
        tree[p[i].FI].pb({i, p[i].SE});
    }
    root(0);
    stk.pb(k);
    dfs(0);
    broot(k);
    tlabel[bdfs(k)] = k;
    string s;
    assert(lptr <= q);
    vi tmp = encode(2, vi({q + 1, k + 1, q}), vector<vi>({vi(blabel, blabel + k), vi(tlabel, tlabel + q), vi(ids, ids + q)}));
    for (int i : tmp) {
        char c = i + '0';
        s += c;
    }
    return s;
}

void bitaro(int N, int M, int Q, int K, vi A, vi B, vll C, vi T, vi X, string S) {
    s = S;
    n = N; m = M; q = Q; k = K;
    REP (i, 0, m) {
        adj[A[i]].pb({B[i], i});
        adj[B[i]].pb({A[i], i});
        c[i] = C[i];
    }
    REP (i, 0, k) {
        c[X[i]] = -1;
        bid[X[i]] = i;
    }
    vi vs;
    for (char c : s) {
        vs.pb(c - '0');
    }
    vector<vi> tmp = decode(2, vi({q + 1, k + 1, q}), vi({k, q, q}), vs);
    REP (i, 0, k) {
        blabel[i] = tmp[0][i];
    }
    REP (i, 0, q) {
        tlabel[i] = tmp[1][i];
    }
    REP (i, 0, q) {
        ids[i] = tmp[2][i];
    }
    REP (i, 0, n) {
        p[i] = {-1, -1};
    }
    vi bstk;
    bstk.pb(k);
    bvis[k] = 1;
    REP (l, 0, q) {
        int bu = bstk.back();
        int u = 0;
        if (bu < k) {
            u = p[A[X[bu]]].SE == X[bu] ? A[X[bu]] : B[X[bu]];
        }
        while (!pq.empty()) {
            pq.pop();
        }
        REP (i, 0, n) {
            d[i] = LINF;
        }
        d[u] = 0;
        pq.push({0, u});
        while (!pq.empty()) {
            auto [ud, u] = pq.top(); pq.pop();
            if (ud != d[u]) {
                continue;
            }
            for (auto [v, i] : adj[u]) {
                if (p[v].FI != -1 && p[v].FI != u) {
                    continue;
                }
                if (p[u].FI != -1 && p[u].FI == v) {
                    continue;
                }
                ll w = c[i];
                if (c[i] == -1) {
                    if (blabel[bid[i]] != l) {
                        continue;
                    }
                    w = 1;
                }
                if (mnto(d[v], ud + w)) {
                    if (c[i] == -1) {
                        bvis[bid[i]] = 1;
                        bl[bid[i]] = bl[bstk.back()] + 1;
                        bstk.pb(bid[i]);
                    }
                    tp[v] = {u, i};
                    pq.push({d[v], v});
                }
            }
        }
        int tid = ids[l];
        int tu = T[tid];
        while (tu != u) {
            p[tu] = tp[tu];
            tu = tp[tu].FI;
        }
        while (!bstk.empty() && bstk.back() != tlabel[tid]) {
            bvis[bstk.back()] = 0;
            bstk.pop_back();
        }
        assert(!bstk.empty());
    }
    REP (i, 0, q) {
        int u = T[i];
        vi e;
        while (u) {
            e.pb(p[u].SE);
            u = p[u].FI;
        }
        reverse(ALL(e));
        answer(e);
    }
}

提出情報

提出日時
問題 C - スパイ 3 (Spy 3)
ユーザ maomao90
言語 C++ 20 (gcc 12.2)
得点 100
コード長 8633 Byte
結果 AC
実行時間 91 ms
メモリ 8956 KiB

コンパイルエラー

Main.cpp:57:9: warning: ‘{anonymous}::qptr’ defined but not used [-Wunused-variable]
   57 |     int qptr;
      |         ^~~~
Main.cpp:55:10: warning: ‘{anonymous}::tdone’ defined but not used [-Wunused-variable]
   55 |     bool tdone[MAXQ + 5];
      |          ^~~~~

ジャッジ結果

セット名 Sample Subtask1
得点 / 配点 0 / 0 100 / 100
結果
AC × 2
AC × 85
セット名 テストケース
Sample sample-01.txt, sample-02.txt
Subtask1 01-01.txt, 01-02.txt, 01-03.txt, 01-04.txt, 01-05.txt, 01-06.txt, 01-07.txt, 01-08.txt, 01-09.txt, 01-10.txt, 01-11.txt, 01-12.txt, 01-13.txt, 01-14.txt, 01-15.txt, 01-16.txt, 01-17.txt, 01-18.txt, 01-19.txt, 01-20.txt, 01-21.txt, 01-22.txt, 01-23.txt, 01-24.txt, 01-25.txt, 01-26.txt, 01-27.txt, 01-28.txt, 01-29.txt, 01-30.txt, 01-31.txt, 01-32.txt, 01-33.txt, 01-34.txt, 01-35.txt, 01-36.txt, 01-37.txt, 01-38.txt, 01-39.txt, 01-40.txt, 01-41.txt, 01-42.txt, 01-43.txt, 01-44.txt, 01-45.txt, 01-46.txt, 01-47.txt, 01-48.txt, 01-49.txt, 01-50.txt, 01-51.txt, 01-52.txt, 01-53.txt, 01-54.txt, 01-55.txt, 01-56.txt, 01-57.txt, 01-58.txt, 01-59.txt, 01-60.txt, 01-61.txt, 01-62.txt, 01-63.txt, 01-64.txt, 01-65.txt, 01-66.txt, 01-67.txt, 01-68.txt, 01-69.txt, 01-70.txt, 01-71.txt, 01-72.txt, 01-73.txt, 01-74.txt, 01-75.txt, 01-76.txt, 01-77.txt, 01-78.txt, 01-79.txt, 01-80.txt, 01-81.txt, 01-82.txt, 01-83.txt, sample-01.txt, sample-02.txt
ケース名 結果 実行時間 メモリ
01-01.txt AC 91 ms 6796 KiB
01-02.txt AC 5 ms 3992 KiB
01-03.txt AC 47 ms 7648 KiB
01-04.txt AC 39 ms 7728 KiB
01-05.txt AC 58 ms 7644 KiB
01-06.txt AC 44 ms 7632 KiB
01-07.txt AC 49 ms 7632 KiB
01-08.txt AC 49 ms 7536 KiB
01-09.txt AC 39 ms 7700 KiB
01-10.txt AC 34 ms 7584 KiB
01-11.txt AC 50 ms 7248 KiB
01-12.txt AC 43 ms 7520 KiB
01-13.txt AC 56 ms 7588 KiB
01-14.txt AC 45 ms 7564 KiB
01-15.txt AC 42 ms 7648 KiB
01-16.txt AC 33 ms 7600 KiB
01-17.txt AC 49 ms 8160 KiB
01-18.txt AC 50 ms 8100 KiB
01-19.txt AC 62 ms 8312 KiB
01-20.txt AC 53 ms 8192 KiB
01-21.txt AC 60 ms 8308 KiB
01-22.txt AC 55 ms 8280 KiB
01-23.txt AC 50 ms 8136 KiB
01-24.txt AC 56 ms 8228 KiB
01-25.txt AC 47 ms 8256 KiB
01-26.txt AC 48 ms 8244 KiB
01-27.txt AC 5 ms 3828 KiB
01-28.txt AC 43 ms 7584 KiB
01-29.txt AC 30 ms 6528 KiB
01-30.txt AC 46 ms 7996 KiB
01-31.txt AC 49 ms 7876 KiB
01-32.txt AC 65 ms 7964 KiB
01-33.txt AC 62 ms 7664 KiB
01-34.txt AC 57 ms 8156 KiB
01-35.txt AC 42 ms 8080 KiB
01-36.txt AC 43 ms 7972 KiB
01-37.txt AC 22 ms 6064 KiB
01-38.txt AC 36 ms 6928 KiB
01-39.txt AC 33 ms 6964 KiB
01-40.txt AC 23 ms 6452 KiB
01-41.txt AC 73 ms 8452 KiB
01-42.txt AC 58 ms 8956 KiB
01-43.txt AC 74 ms 8740 KiB
01-44.txt AC 42 ms 8676 KiB
01-45.txt AC 25 ms 5696 KiB
01-46.txt AC 29 ms 6304 KiB
01-47.txt AC 25 ms 6420 KiB
01-48.txt AC 5 ms 3960 KiB
01-49.txt AC 5 ms 3824 KiB
01-50.txt AC 30 ms 6572 KiB
01-51.txt AC 11 ms 3916 KiB
01-52.txt AC 6 ms 3924 KiB
01-53.txt AC 39 ms 6612 KiB
01-54.txt AC 27 ms 5060 KiB
01-55.txt AC 46 ms 6220 KiB
01-56.txt AC 48 ms 7960 KiB
01-57.txt AC 60 ms 8140 KiB
01-58.txt AC 52 ms 7076 KiB
01-59.txt AC 66 ms 8320 KiB
01-60.txt AC 59 ms 8036 KiB
01-61.txt AC 71 ms 8008 KiB
01-62.txt AC 68 ms 8004 KiB
01-63.txt AC 72 ms 8360 KiB
01-64.txt AC 38 ms 7688 KiB
01-65.txt AC 40 ms 6448 KiB
01-66.txt AC 48 ms 8772 KiB
01-67.txt AC 42 ms 6500 KiB
01-68.txt AC 48 ms 8804 KiB
01-69.txt AC 5 ms 3696 KiB
01-70.txt AC 5 ms 3724 KiB
01-71.txt AC 7 ms 3864 KiB
01-72.txt AC 24 ms 5236 KiB
01-73.txt AC 36 ms 6008 KiB
01-74.txt AC 36 ms 6024 KiB
01-75.txt AC 24 ms 6028 KiB
01-76.txt AC 5 ms 3892 KiB
01-77.txt AC 47 ms 7300 KiB
01-78.txt AC 46 ms 7104 KiB
01-79.txt AC 53 ms 7356 KiB
01-80.txt AC 5 ms 3856 KiB
01-81.txt AC 53 ms 7444 KiB
01-82.txt AC 45 ms 7492 KiB
01-83.txt AC 57 ms 7512 KiB
sample-01.txt AC 5 ms 3820 KiB
sample-02.txt AC 5 ms 3908 KiB