Submission #1256686

#TimeUsernameProblemLanguageResultExecution timeMemory
1256686goulthenBitaro’s Party (JOI18_bitaro)C++20
100 / 100
839 ms277932 KiB
//#pragma GCC optimize("O3") //#pragma GCC optimize("unroll-loops") #include <bits/stdc++.h> using namespace std; #include <ext/pb_ds/assoc_container.hpp> using namespace __gnu_pbds; template <class T> using Tree = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>; #define int long long #define ll long long #define pii pair<int, int> #define pll pair<ll, ll> #define fi first #define se second #define rep(i, a, b) for (int i = a; i <= b; ++i) #define per(i, b, a) for (int i = b; i >= a; --i) #define pb push_back #define eb emplace_back #define all(v) (v).begin(), (v).end() #define lsb(x) (x)&(-x) #define bug(x) cerr << #x << " " << x << endl; void setIO(string name = "") { ios_base::sync_with_stdio(false); cin.tie(nullptr); cout.tie(nullptr); if (!name.empty()) { freopen((name + ".in").c_str(), "r", stdin); freopen((name + ".out").c_str(), "w", stdout); } } ll fexp(ll a, ll b, ll m) { if (b == 0) return 1LL; ll p = a; ll ans = 1; while (b > 0) { if (b % 2 != 0) ans = (ans * p) % m; p = (p * p) % m; b >>= 1; } return ans; } const int MAXN = 2e6 + 10; const int INF = 1e18 + 5; const int MOD = 1e9+7; const int SQ = 100; void solve() { int n, m, q; if (!(cin >> n >> m >> q)) return; vector<vector<int>> rg(n); for (int i = 0; i < m; i++) { int u, v; cin >> u >> v; --u; --v; rg[v].pb(u); } vector<vector<pair<int,int>>> ps(n); vector<int> fromv(n, -1); for (int i = 0; i < n; i++) { ps[i].clear(); ps[i].pb({0, i}); vector<int> from_indices; for (int j : rg[i]) { for (auto &pr : ps[j]) { int dist = pr.fi; int idx = pr.se; if (fromv[idx] == -1) { from_indices.pb(idx); fromv[idx] = dist + 1; } else { fromv[idx] = max(fromv[idx], dist + 1); } } } for (int j : from_indices) { ps[i].pb({fromv[j], j}); } sort(ps[i].rbegin(), ps[i].rend()); while ((int)ps[i].size() > SQ) ps[i].pop_back(); for (int j : from_indices) fromv[j] = -1; } vector<char> mk(n, 0); for (int qi = 0; qi < q; qi++) { int t, y; cin >> t >> y; --t; vector<int> c(y); for (int i = 0; i < y; i++) { cin >> c[i]; --c[i]; mk[c[i]] = 1; } int ans = -1; if (y >= SQ) { vector<int> dp(t + 1, -1); dp[t] = 0; for (int i = t; i >= 0; --i) { if (dp[i] == -1) continue; if (!mk[i]) ans = max(ans, dp[i]); for (int j : rg[i]) { if (j <= t) dp[j] = max(dp[j], dp[i] + 1); } } } else { for (auto &pr : ps[t]) { int dist = pr.fi; int idx = pr.se; if (!mk[idx]) { ans = dist; break; } } } cout << ans << '\n'; for (int x : c) mk[x] = 0; } } int32_t main() { setIO(); int tt = 1; //cin >> tt; while (tt-- > 0) solve(); return 0; }

Compilation message (stderr)

bitaro.cpp: In function 'void setIO(std::string)':
bitaro.cpp:29:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   29 |         freopen((name + ".in").c_str(), "r", stdin);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
bitaro.cpp:30:16: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   30 |         freopen((name + ".out").c_str(), "w", stdout);
      |         ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...