Submission #128861

#TimeUsernameProblemLanguageResultExecution timeMemory
128861RockyBBitaro’s Party (JOI18_bitaro)C++17
14 / 100
511 ms90896 KiB
// In The Name Of The God

#include <bits/stdc++.h>

#define f first
#define s second

#define pb push_back
#define pp pop_back

#define all(x) x.begin(), x.end()
#define sz(x) (int)x.size()

#define rep(a, b, c) for (int (a) = (b); (a) <= (c); (a)++) 
#define per(a, b, c) for (int (a) = (b); (a) >= (c); (a)--) 

#define nl '\n'
#define ioi exit(0);

using namespace std;

const int MAX_N = (int)1e5 + 7;
const int K = 100;
const int inf = (int)1e9 + 7;

int n, m, q;
vector <int> g[MAX_N];

int T, k;
int tmr;
int a[MAX_N], was[MAX_N], dp[MAX_N], h[MAX_N];
bool ban[MAX_N];

int calc(int v) {
  int res = -inf;
  if (was[v] == tmr) return dp[v];
  was[v] = tmr;
  if (!ban[v]) res = 0;
  for (auto to : g[v]) {
    res = max(res, calc(to) + 1);
  }
  return dp[v] = res;
}
void read() {
  cin >> T >> k;
  rep(i, 1, k) {
    cin >> a[i];
  }
}
void naive() {
  rep(i, 1, k) {
    ban[a[i]] = 1;
  }  
  ++tmr;
  int res = calc(T);
  if (res < 0) res = -1;
  cout << res << nl;
  rep(i, 1, k) {
    ban[a[i]] = 0;
  }  
}
int sz[MAX_N], used[MAX_N];
pair <int, int> bfr[MAX_N];
pair <int, int> dist[MAX_N][K];
void pre() {
  rep(i, 1, n) {
    int S = 0;
    bfr[S++] = {0, i};
    for (auto to : g[i]) {
      for (auto it : dist[to]) {
        bfr[S++] = {it.f + 1, it.s};
      }
    }
    sort(bfr, bfr + S, greater < pair <int, int> > () );
    rep(j, 0, S - 1) {
      if (used[bfr[j].s] == i) continue;
      if (sz[i] < K) {
        used[bfr[i].s] = i;
        dist[i][sz[i]++] = bfr[i];
      }
      else break;
    }
  }
}
void fast() {
  int res = -1;
  rep(i, 1, k) {
    ban[a[i]] = 1;
  }
  rep(i, 0, sz[T] - 1) {
    if (!ban[dist[T][i].s]) {
      res = max(res, dist[T][i].f);
      break;
    }
  }
  rep(i, 1, k) {
    ban[a[i]] = 0;
  }
  cout << res << nl;
  //cerr << "DA\n";
}
int main() {
  ios_base :: sync_with_stdio(0);
  cin.tie(0), cout.tie(0);
  #ifdef IOI
    freopen ("in.txt", "r", stdin);
    freopen ("B.out", "w", stdout);
  #endif
  cin >> n >> m >> q;
  rep(i, 1, m) {
    int s, e;
    cin >> s >> e;
    g[e].pb(s);
  }
  pre();
  //for (auto it : st[2]) cerr << it.f << ' ' << it.s << nl;
  
  rep(i, 1, q) {
    read();
    if (k >= K || T <= K) naive();
    else fast();
  }
  ioi
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...