제출 #1339907

#제출 시각아이디문제언어결과실행 시간메모리
1339907repmannBitaro’s Party (JOI18_bitaro)C++20
100 / 100
788 ms85204 KiB
#include <bits/stdc++.h>
using namespace std;
const int SQRT = 100;
int N, M, Q;
int iter, I[100001];
int DIST[100001];
pair <int, int> DP[SQRT + 1][100001];
vector <int> VG[100001];
int BFS(int node)
{
  int ret = -1;
  for(int i = 1; i <= node; i++) DIST[i] = 0;
  for(int i = node; i >= 1; i--)
  {
    if(!DIST[i] && (i < node)) continue;
    for(int x : VG[i]) DIST[x] = max(DIST[i] + 1, DIST[x]);
    if(I[i] < iter) ret = max(DIST[i], ret);
  }
  return ret;
}
int main()
{
  ios_base::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  cin >> N >> M >> Q;
  int u, v;
  while(M--)
  {
    cin >> u >> v;
    VG[v].push_back(u);
  }
  for(int i = 1; i <= N; i++)
  {
//    cout << i << ":\n";
    priority_queue <array <int, 4>> H;
    H.push({0, i, i, 1});
    for(int x : VG[i]) H.push({DP[1][x].first + 1, DP[1][x].second, x, 1});
    for(int j = 1; j <= SQRT; j++)
    {
      if(!H.size()) break;
      int a = H.top()[0], b = H.top()[1], c = H.top()[2], d = H.top()[3];
      H.pop();
      if(I[b] < i) {DP[j][i] = {a, b}; I[b] = i;}
      else j--;
//      cout << j << ": " << a << ' ' << b << '\n';
      if((c < i) && (d < SQRT) && (DP[d + 1][c].second)) H.push({DP[d + 1][c].first + 1, DP[d + 1][c].second, c, d + 1});
    }
  }
  fill(I + 1, I + N + 1, 0);
  int t, n, s;
  while(Q--)
  {
    iter++;
    cin >> t >> n;
    for(int i = 1; i <= n; i++) {cin >> s; I[s] = iter;}
    if(n >= SQRT) {cout << BFS(t) << '\n'; continue;}
    bool flag = false;
    for(int i = 1; (i <= SQRT) && DP[i][t].second && !flag; i++) if(I[DP[i][t].second] < iter) {cout << DP[i][t].first << '\n'; flag = true;}
    if(!flag) cout << "-1\n";
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...