Submission #1239187

#TimeUsernameProblemLanguageResultExecution timeMemory
1239187pvb.tunglamBitaro’s Party (JOI18_bitaro)C++20
7 / 100
2093 ms13284 KiB
#include <bits/stdc++.h>
#define hash  _hash_
#define y1    _y1_
#define left  _left_
#define right _right_
#define dec   _dec_

using namespace std;
using ll = long long;

/*----------- I alone decide my fate! ------------*/
/*  I just do what I gotta, in the heat of the summer...  */

const int MAXN = 100000 + 5;
const int B    = 320;                  // v(SYj) ˜ 320

int N, M, Q;
vector<int> adj[MAXN], radj[MAXN];
vector<pair<int,int>> best[MAXN];       // (len, start), gi?m d?n theo len
bool ban[MAXN];                         // d?nh b?n

int dp[MAXN];                           // dùng cho truy v?n n?ng
bool vis_dp[MAXN];                      // c? “dã tính dp[u]”

/// G?p best[src] (dã s?p gi?m d?n) vào best[dst], c?ng len+1
void merge_into(vector<pair<int,int>> &dst,
                const vector<pair<int,int>> &src)
{
    static pair<int,int> buf[2 * B];
    int i = 0, j = 0, p = 0;
    int na = dst.size(), nb = src.size();
    while ((i < na || j < nb) && p < B) {
        pair<int,int> cand;
        if (j == nb ||
           (i < na && dst[i].first >= src[j].first + 1))
        {
            cand = dst[i++];
        } else {
            cand = {src[j].first + 1, src[j].second};
            ++j;
        }
        // lo?i trùng start
        bool dup = false;
        for (int k = 0; k < p; ++k) {
            if (buf[k].second == cand.second) {
                dup = true;
                break;
            }
        }
        if (!dup) buf[p++] = cand;
    }
    dst.assign(buf, buf + p);
}

/// Tính dp[u] = du?ng di dài nh?t k?t thúc ? u, b? qua các u b? ban
int calc(int u) {
    if (vis_dp[u]) return dp[u];
    vis_dp[u] = true;
    dp[u] = ban[u] ? INT_MIN/2 : 0;
    for (int v: radj[u]) {
        int t = calc(v);
        dp[u] = max(dp[u], t + 1);
    }
    return dp[u];
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    cin >> N >> M >> Q;
    for (int i = 0; i < M; ++i) {
        int u, v;
        cin >> u >> v;
        adj[u].push_back(v);
        radj[v].push_back(u);
    }

    // 1) Kh?i t?o best[u] v?i (len=0, start=u)
    for (int u = 1; u <= N; ++u) {
        best[u].push_back({0, u});
    }

    // 2) Ti?n x? lý cho truy v?n “nh?”
    //    Duy?t topo (1..N) vì d? th? DAG (S < E)
    for (int u = 1; u <= N; ++u) {
        for (int v: adj[u]) {
            merge_into(best[v], best[u]);
        }
    }

    vector<int> busy_list;
    while (Q--) {
        int T, Y;
        cin >> T >> Y;
        busy_list.clear();
        for (int i = 0; i < Y; ++i) {
            int x; 
            cin >> x;
            ban[x] = true;
            busy_list.push_back(x);
        }

        int answer = -1;
        if (Y < B) {
            // --- truy v?n nh? ---
            for (auto &p: best[T]) {
                if (!ban[p.second]) {
                    answer = p.first;
                    break;
                }
            }
        } else {
            // --- truy v?n n?ng ---
            // reset c? vis_dp[]
            fill(vis_dp+1, vis_dp+N+1, false);
            int res = calc(T);
            answer = (res < 0 ? -1 : res);
        }

        cout << answer << "\n";

        // xoá dánh d?u ban[]
        for (int x: busy_list) {
            ban[x] = false;
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...