Submission #1305303

#TimeUsernameProblemLanguageResultExecution timeMemory
1305303alan_cBitaro’s Party (JOI18_bitaro)C++20
0 / 100
8 ms1092 KiB
#include <bits/stdc++.h>
using namespace std;

const int N = 1e5 + 1, Y = 100;
int dp[N];
vector<int> adj[N];
vector<pair<int, int>> best[N];

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

  int n, m, q;
  cin >> n >> m >> q;
  while (m--) {
    int s, e;
    cin >> s >> e;
    adj[e].push_back(s);
  }

  for (int i = 1; i <= n; i++) {
    map<int, int> len = {{i, 0}};
    for (int j : adj[i])
      for (auto &[l, k] : best[j])
        len[k] = max(len[k], l + 1);

    best[i].reserve(len.size());
    for (auto &[j, l] : len)
      best[i].emplace_back(l, j);

    int size = min(Y, (int)len.size());
    nth_element(best[i].begin(), best[i].begin() + size - 1, best[i].end(),
                greater());
    best[i].erase(best[i].begin() + size, best[i].end());
    sort(best[i].begin(), best[i].end(), greater());
  }

  while (q--) {
    int t, y;
    cin >> t >> y;

    int ans = -1;
    if (y <= Y) {
      set<int> busy;
      while (y--) {
        int c;
        cin >> c;
        busy.insert(c);
      }

      for (auto &[l, i] : best[t]) {
        if (!busy.count(i)) {
          ans = l;
          break;
        }
      }
    } else {
      memset(dp, 0, sizeof(dp));
      while (y--) {
        int c;
        cin >> c;
        dp[c] = -1;
      }

      for (int i = 1; i <= t; i++)
        if (dp[i] != -1)
          for (int j : adj[i])
            dp[i] = max(dp[i], dp[j] + 1);

      ans = dp[t];
    }
    cout << ans << '\n';
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...