Submission #1354211

#TimeUsernameProblemLanguageResultExecution timeMemory
1354211thewizardmanBitaro’s Party (JOI18_bitaro)C++20
100 / 100
1041 ms416736 KiB
#pragma GCC optimize("Ofast,unroll-loops")
#include <bits/stdc++.h>
#define ms(x, y) memset(x, y, sizeof x)
#define sp ,' ',
#define el ,'\n'
using namespace std;
using ll = long long;
using ld = long double;
using pii = pair<int, int>;
using l2 = array<ll, 2>;
using l3 = array<ll, 3>;

template<typename... Args>
inline void out(Args... args) {
  (cout << ... << args);
}

struct r {
  template<typename T>
  inline r& operator,(T& x) {
    cin >> x;
    return *this;
  }
} in;
#define in in,

int n, m, q, pa[100005], val[100005], dph[100005], ans[100005];
vector<int> adj[100005];
vector<pii> dp[100005];
vector<tuple<int, vector<int>, int>> queries, queriesh;

void solve() {
  ms(ans, -1);
  in n, m, q;
  while (m--) {
    int u, v; in u, v;
    adj[v].push_back(u);
  }
  for (int i = 0; i < q; i++) {
    int t, y; in t, y;
    vector<int> v(y);
    for (auto &e: v) in e;
    sort(v.begin(), v.end());
    if (y >= 330) queriesh.push_back({t, v, i});
    else queries.push_back({t, v, i});
  }
  sort(queries.begin(), queries.end(), [](auto &l, auto &r) {return get<0>(l) < get<0>(r);});
  int i = 1;
  for (auto &[t, v, idx]: queries) {
    for (; i <= t; i++) {
      vector<int> rem;
      for (auto p: adj[i]) for (auto r: dp[p]) {
        if (val[r.second] == 0) val[r.second] = r.first + 1, rem.push_back(r.second);
        else if (r.first + 1 > val[r.second]) val[r.second] = r.first + 1;
      }
      dp[i].push_back({0, i});
      for (auto r: rem) dp[i].push_back({val[r], r}), val[r] = 0;
      rem.clear();
      sort(dp[i].begin(), dp[i].end(), greater<>());
      dp[i].resize(min(dp[i].size(), (size_t)330));
    }
    for (auto r: dp[t]) if (!binary_search(v.begin(), v.end(), r.second)) {ans[idx] = r.first; break;}
  }
  for (auto &[t, v, idx]: queriesh) {
    ms(dph, 0);
    for (auto e: v) dph[e] = INT_MIN;
    for (int i = 1; i <= t; i++) for (auto p: adj[i]) if (dph[p] + 1 > dph[i]) dph[i] = dph[p] + 1;
    ans[idx] = max(ans[idx], dph[t]);
  }
  for (int i = 0; i < q; i++) out(ans[i] el);
}

signed main() {
  ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
  int t = 1;
  // in(t);
  while (t--) solve();
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...