Submission #1322364

#TimeUsernameProblemLanguageResultExecution timeMemory
1322364camposBitaro’s Party (JOI18_bitaro)C++20
0 / 100
11 ms6480 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; void solution() { int n, m, q; cin >> n >> m >> q; vector<int> adj[n]; vector<int> value(n); for(int i = 0; i < m; i++) { int u, v; cin >> u >> v; u -= 1, v -= 1; adj[u].emplace_back(v); value[v] += 1; } queue<int> Q; for(int i = 0; i < n; i++) { if(!value[i]) Q.push(i); } vector<int> ord; while(Q.size()) { int u = Q.front(); Q.pop(); ord.emplace_back(u); for(int v : adj[u]) { value[v] -= 1; if(!value[v]) Q.push(v); } } int root = sqrt(n) + 100; vector<pair<int,int>> dp[n]; vector<bool> used(n); for(auto u : ord) { 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; } while(len(dp[u]) > root) dp[u].pop_back(); for(auto v : adj[u]) { for(auto [x, y] : dp[u]) { dp[v].emplace_back(x + 1, y); } } } vector<bool> cant(n); 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; cant[c[i]] = 1; } if(y >= root) { vector<int> ndp(n, -INF); for(auto u : ord) { if(!cant[u]) { chmax(ndp[u], 0LL); } for(auto v : adj[u]) { chmax(ndp[v], ndp[u] + 1); } } cout << (ndp[t] == -INF ? -1LL : ndp[t]) << "\n"; } else { int ans = -1; for(auto [l, u] : dp[t]) { if(!cant[u]) { ans = l; break; } } cout << ans << "\n"; } for(int i = 0; i < y; i++) { cant[c[i]] = 0; } } } /* * 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...