제출 #1331747

#제출 시각아이디문제언어결과실행 시간메모리
1331747peanutBitaro’s Party (JOI18_bitaro)C++20
0 / 100
3 ms1348 KiB
#include <bits/stdc++.h>

using namespace std;
using ll = long long;
using pii = pair<ll, ll>;
#define all(x) (x).begin(), (x).end()
#define sz(x) (int)(x).size()
#define fi first
#define se second
#define pb push_back
#define eb emplace_back
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
template<class X, class Y> bool maximize (X &x, const Y &y) {return x < y ? x = y, 1 : 0;}
template<class X, class Y> bool minimize (X &x, const Y &y) {return x > y ? x = y, 1 : 0;}
const int maxn = 1e5 + 5;
const int MOD = 1e9 + 7;
const int INF = 0x3f3f3f3f;
const int B = 200;

int n, m, q;
vector<int> radj[maxn];
vector<pair<int, int>> paths[maxn];
int idk[maxn];

int main()
{
    ios::sync_with_stdio(false); cin.tie(0);
    //freopen(".INP", "r", stdin);
    //freopen(".OUT", "w", stdout);
    cin >> n >> m >> q;
    for (int i = 1; i <= m; ++i) {
        int u, v; cin >> u >> v;
        radj[v].pb(u);
    }

    memset(idk, -1, sizeof idk);
    for (int i = 1; i <= n; ++i) {
        paths[i].pb({0, i});
        vector<int> adj;
        for (auto j : radj[i]) {
            for (auto k : paths[j]) {
                if (idk[k.se] == -1) {
                    adj.pb(k.se);
                    idk[k.se] = k.fi + 1;
                }
                else idk[k.se] = max(idk[k.se], k.fi + 1);
            }
        }
        for (auto j : adj) paths[i].pb({idk[j], j}), idk[j] = -1;
        sort(paths[i].rbegin(), paths[i].rend());
        while (sz(paths[i]) > B) paths[i].pop_back();
    }

    vector<int> blocked(n+1, 0);
    while (q--) {
        int t, y; cin >> t >> y;
        vector<int> temp;
        for (int i = 0; i < y; ++i) {
            int x; cin >> x;
            blocked[x] = 1, temp.pb(x);
        }
        if (y >= B) {
            vector<int> dist(n+1, -1);
            dist[t] = 0;
            for (int i = t; i >= 1; --i) {
                for (auto v : radj[i]) {
                    dist[v] = max(dist[v], dist[i] + 1);
                }
            }
            int ans = -1;
            for (int i = 1; i <= t; ++i) if (!blocked[i]) ans = max(ans, dist[i]);
            cout << ans << '\n';
        }
        else {
            bool flag = 0;
            for (auto i : paths[t]) {
                if (!blocked[i.se]) {
                    cout << i.fi << '\n';
                    flag = 1;
                    break;
                }
            }
            if (!flag) cout << -1 << '\n';
        }
        for (auto i : temp) blocked[i] = 0;
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...