Submission #881623

#TimeUsernameProblemLanguageResultExecution timeMemory
881623AverageAmogusEnjoyerBitaro’s Party (JOI18_bitaro)C++17
0 / 100
15 ms16300 KiB
#include <bits/stdc++.h> using namespace std; using ll = long long; template<class T> bool cmin(T &i, T j) { return i > j ? i=j,1:0; } template<class T> bool cmax(T &i, T j) { return i < j ? i=j,1:0; } const int B = 90, N = 1e5; set<pair<int,int>> longest_dist[N]; map<int,int> dist_from_node[N]; vector<int> adj[N]; int V[N],dist[N]; bool banned[N]; /* map<int,int> start_node[N]; void dfs(int u,int d,int start) { for (int &v: adj[u]) { if (!start_node[u].count(start) || start_node[u][start] < d) { start_node[u][start]=d; if (dist[v].size() == B) { if (*dist[v].begin() < d) { dist[v].erase(dist[v].begin()); dist[v].insert(d); dfs(v,d+1,start); } } else { dist[v].insert(d); dfs(v,d+1,start); } } } } */ void solve() { int n,m,q; cin >> n >> m >> q; for (int u,v;m--;) { cin >> u >> v; assert(u < v); adj[--u].push_back(--v); } for (int i=0;i<n;i++) { if (longest_dist[i].size() != B) { longest_dist[i].insert(make_pair(0,i)); } for (int &v: adj[i]) { for (auto it = longest_dist[i].begin();it != longest_dist[i].end();it++) { pair<int,int> C = *it; C.first++; if (!dist_from_node[v].count(C.second) || dist_from_node[v][C.second] < C.first) { if (dist_from_node[v].count(C.second)) { longest_dist[v].erase(make_pair(dist_from_node[v][C.second], C.second)); } dist_from_node[v][C.second]=C.first; if (longest_dist[v].size() == B) { if ((*longest_dist[v].begin()).first < C.first) { longest_dist[v].erase(longest_dist[v].begin()); longest_dist[v].insert(C); } } else { longest_dist[v].insert(C); } } } } } for (int u,sz;q--;) { cin >> u >> sz; --u; for (int i=0;i<sz;i++) { cin >> V[i]; banned[--V[i]]=true; } if (sz >= int(longest_dist[u].size())) { memset(dist,-1,4*(u+1)); for (int i=0;i<=u;i++) { if (!banned[i]) { cmax(dist[i],0); } if (dist[i] != -1) { // this node CAN be reached for (int &v: adj[i]) { cmax(dist[v],dist[u]+1); } } } cout << dist[u] << "\n"; } else { auto it = longest_dist[u].end(); while(true) { assert(it != longest_dist[u].begin()); it--; if (!banned[(*it).second]) { cout << (*it).first << "\n"; break; } } } for (int i=0;i<sz;i++) { banned[V[i]]=false; } } /* for (int i=0;i<n;i++) { cout << "Node " << i << "\n"; for (auto [d,node]: longest_dist[i]) { cout << "Dist " << d << " from node " << node << "\n"; } cout << "\n"; } */ } int main() { ios_base::sync_with_stdio(0); cin.tie(0); int _t = 1; for (int i=1;i<=_t;i++) { solve(); } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...