Submission #1322378

#TimeUsernameProblemLanguageResultExecution timeMemory
1322378camposBitaro’s Party (JOI18_bitaro)C++20
0 / 100
34 ms16424 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;

template <class T>
using ord_set = tree<T, null_type, less<T>, rb_tree_tag,
tree_order_statistics_node_update>;

#define int long long
#define all(x) x.begin(), x.end()
#define chmin(a, b) a = min(a, b)
#define chmax(a, b) a = max(a, b)
#define len(a) ((int)a.size())

#ifdef LOCAL
#include "algo/debug.h"
#else
#define debug(...) 42
#endif

const int dx[] = {1, 0, -1, 0};
const int dy[] = {0, 1, 0, -1};

const int INF = 0x3f3f3f3f3f3f3f3f;

const int MAXN = 1e5 + 10;
const int ROOT = sqrt(MAXN) + 100;

vector<pair<int,int>> dp[MAXN];
vector<bool> used(MAXN);
vector<bool> can(MAXN, 1);

void solution() {
  int n, m, q;
  cin >> n >> m >> q;

  vector<int> adj[n];
  for(int i = 0; i < m; i++) {
    int u, v;
    cin >> u >> v;
    u -= 1, v -= 1;
    adj[u].emplace_back(v);
  }

  for(int u = 0; u < n; u++) {
    vector<pair<int,int>> ndp;

    dp[u].emplace_back(0, u);

    sort(all(dp[u]), greater<>());

    for(auto [l, v] : dp[u]) {
      if(used[v]) continue;
      used[v] = 1;
      ndp.emplace_back(l, v);
    }

    dp[u] = ndp;

    for(auto [l, v] : dp[u]) {
      used[v] = 0;
    }


    for(auto v : adj[u]) {
      for(auto [x, y] : dp[u]) {
        dp[v].emplace_back(x + 1, y);
      }
    }

    while(len(dp[u]) > ROOT) dp[u].pop_back();
  }


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

    vector<int> c(y);
    for(int i = 0; i < y; i++) {
      cin >> c[i];
      c[i] -= 1;
      can[c[i]] = 0;
    }

    int ans = -1;
    if(y >= ROOT) {
      vector<int> ndp(n, -INF);
      ndp[t] = 0;
      for(int u = 0; u < n; u++) {
        if(can[u]) chmax(ndp[u], 0LL);
        for(auto v : adj[u]) {
          chmax(ndp[v], ndp[u] + 1);
        }
      }
      chmax(ans, ndp[t]);
    }
    else {
      for(auto [l, u] : dp[t]) {
        if(!can[u]) continue;
        ans = l;
        break;
      }
    }

    cout << ans << "\n";

    for(int i = 0; i < y; i++) {
      can[c[i]] = 1;
    }
  }
}

/*
 * LE O PROBLEMA ATE O FINAL
 * LE OS SAMPLES, ENTENDE OS SAMPLES
 * LE INPUT, LE OUTPUT
 * LE OS CONSTRAINTS
 */

signed main() {
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
  int tt = 1;
  while(tt--) {
    solution();
  }
  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...