Submission #414972

#TimeUsernameProblemLanguageResultExecution timeMemory
414972nvmdavaBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1626 ms420208 KiB
#include <bits/stdc++.h> using namespace std; #define ll long long #define ff first #define ss second mt19937 rng(chrono::steady_clock::now().time_since_epoch().count()); const int N = 100005; const ll MOD = 1000000007; const ll INF = 0x3f3f3f3f3f3f3f3f; const int SQ = 300; vector<int> to[N], fr[N]; vector<pair<int, int> > ans[N]; int vis[N]; int tag = 0; int d[N]; int main(){ ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0); int n, m, q; cin>>n>>m>>q; while(m--){ int s, e; cin>>s>>e; fr[s].push_back(e); to[e].push_back(s); } for(int i = 1; i <= n; ++i){ ans[i].push_back({i, 0}); for(auto& j : to[i]){ ++tag; vector<pair<int, int> > tmp, &v1 = ans[i], &v2 = ans[j]; int i1 = 0, i2 = 0, s1 = v1.size(), s2 = v2.size(); while(tmp.size() < SQ && (i1 < s1 || i2 < s2) ){ if(i1 != s1 && vis[v1[i1].ff] == tag){ ++i1; continue; } if(i2 != s2 && vis[v2[i2].ff] == tag){ ++i2; continue; } if(i2 == s2 || v1[i1].ss > v2[i2].ss + 1){ vis[v1[i1].ff] = tag; tmp.push_back({v1[i1].ff, v1[i1].ss}); ++i1; continue; } vis[v2[i2].ff] = tag; tmp.push_back({v2[i2].ff, v2[i2].ss + 1}); ++i2; } swap(v1, tmp); } } while(q--){ ++tag; int res = -1; int t, y; cin>>t>>y; while(y--){ int w; cin>>w; vis[w] = tag; } for(auto& [v, d] : ans[t]){ if(vis[v] != tag){ res = d; break; } } if(res != -1){ cout<<res<<'\n'; continue; } for(int i = t + 1; i <= n; ++i) d[i] = -MOD; d[t] = 0; if(vis[t] != tag) res = 0; for(int i = t - 1; i > 0; --i){ d[i] = -MOD; for(auto& x : fr[i]) d[i] = max(d[i], d[x] + 1); if(vis[i] != tag) res = max(res, d[i]); } cout<<res<<'\n'; } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...