Submission #1303342

#TimeUsernameProblemLanguageResultExecution timeMemory
1303342olocBitaro’s Party (JOI18_bitaro)C++20
100 / 100
697 ms411844 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; typedef long long ll; typedef long double ld; typedef pair<int, int> pii; typedef pair<ll, ll> pll; typedef vector<int> vect; #define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> #define ordered_multiset tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> #define pb push_back #define f first #define s second const int N = 1e5 + 1; const int sq = 320; vector<int> graf[N]; vector<pii> merguj(vector<pii>& a, vector<pii>& b, vector<int>& odw, int tmp){ vector<pii> wyn; int n = a.size(), m = b.size(); int i = 0, j = 0; while(i < n && j < m && wyn.size() < sq){ while(i < n && odw[a[i].s] == tmp){ i++; } while(j < m && odw[b[j].s] == tmp){ j++; } if(i == n || j == m) break; if(a[i].f > b[j].f){ wyn.pb({a[i].f, a[i].s}); odw[a[i].s] = tmp; i++; }else{ wyn.pb({b[j].f + 1, b[j].s}); odw[b[j].s] = tmp; j++; } } while(i < n && wyn.size() < sq){ while(i < n && odw[a[i].s] == tmp){ i++; } if(i == n) break; wyn.pb({a[i].f, a[i].s}); odw[a[i].s] = tmp; i++; } while(j < m && wyn.size() < sq){ while(j < m && odw[b[j].s] == tmp){ j++; } if(j == m) break; wyn.pb({b[j].f + 1, b[j].s}); odw[b[j].s] = tmp; j++; } return wyn; } int main(){ ios_base::sync_with_stdio(0); cin.tie(0); int n, m, q; cin >> n >> m >> q; for(int i = 0; i < m; i++){ int a, b; cin >> a >> b; graf[b].pb(a); } vector<vector<pii>> best_sq(n + 1); vector<int> odw(n + 1, 0); int it = 1; for(int i = 1; i <= n; i++){ for(int u : graf[i]){ best_sq[i] = merguj(best_sq[i], best_sq[u], odw, it++); } if(best_sq[i].size() < sq){ best_sq[i].pb({0, i}); } } vector<int> zak(n + 1, 0); for(int i = 1; i <= q; i++){ int t, x; cin >> t >> x; for(int j = 0; j < x; j++){ int a; cin >> a; zak[a] = i; } if(x >= sq){ vector<int> dp(n + 1, -1e9); dp[t] = 0; for(int v = t; v >= 1; v--){ for(int u : graf[v]){ dp[u] = max(dp[u], dp[v] + 1); } if(zak[v] == i){ dp[v] = -1; } } int best = -1; for(int v = 1; v <= t; v++){ best = max(best, dp[v]); } cout << best << "\n"; }else{ bool flaga = true; for(pii a : best_sq[t]){ int val = a.f, v = a.s; if(zak[v] != i){ cout << val << "\n"; flaga = false; break; } } if(flaga) cout << "-1\n"; } } // cout << "\n"; // for(int i = 1; i <= n; i++){ // cout << "i: " << i << "\n"; // for(pii a : best_sq[i]){ // cout << "v: " << a.s << " val: " << a.f << "\n"; // } // } return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...