Submission #948650

#TimeUsernameProblemLanguageResultExecution timeMemory
948650JakobZorzBitaro’s Party (JOI18_bitaro)C++17
14 / 100
2062 ms420136 KiB
#include<iostream> #include<vector> #include<queue> #include<stack> #include<algorithm> #include<limits.h> #include<math.h> #include<map> #include<set> #include<unordered_map> #include<unordered_set> #include<iomanip> #include<cstring> #include<random> typedef long long ll; typedef unsigned long long ull; typedef long double ld; using namespace std; int n,m,q; vector<int>nodes[100000]; vector<int>rev[100000]; vector<pair<int,int>>farthest[100000]; // (dist,node) const int CHUNK_SIZE=300; int solve(int src,vector<int>blocked){ vector<int>in(n); vector<int>res(n); queue<int>q; for(int i=0;i<n;i++){ in[i]=(int)rev[i].size(); if(in[i]==0) q.push(i); } for(int i:blocked) res[i]=-1e9; while(q.size()){ int node=q.front(); q.pop(); for(int ne:rev[node]) res[node]=max(res[node],res[ne]+1); for(int ne:nodes[node]){ in[ne]--; if(in[ne]==0) q.push(ne); } } return max(-1,res[src]); } void setup(){ vector<int>in(n); queue<int>q; for(int i=0;i<n;i++){ in[i]=(int)rev[i].size(); if(in[i]==0) q.push(i); } while(q.size()){ int node=q.front(); q.pop(); vector<int>it(rev[node].size()); while(farthest[node].size()<CHUNK_SIZE){ int nxt=-1; for(int i=0;i<(int)it.size();i++){ if(it[i]==(int)farthest[rev[node][i]].size()) continue; if(nxt==-1||farthest[rev[node][i]][it[i]].first>farthest[rev[node][nxt]][it[nxt]].first) nxt=i; } if(nxt==-1) break; farthest[node].push_back(farthest[rev[node][nxt]][it[nxt]]); farthest[node].back().first++; it[nxt]++; } if(farthest[node].size()<CHUNK_SIZE) farthest[node].emplace_back(0,node); for(int ne:nodes[node]){ in[ne]--; if(in[ne]==0) q.push(ne); } } } void solve(){ cin>>n>>m>>q; for(int i=0;i<m;i++){ int a,b; cin>>a>>b; a--;b--; nodes[a].push_back(b); rev[b].push_back(a); } setup(); while(q--){ int src,k; cin>>src>>k; src--; vector<int>blocked(k); for(int&i:blocked){ cin>>i; i--; } unordered_set<int>s(blocked.begin(),blocked.end()); int res=-1; for(auto[d,i]:farthest[src]){ if(s.count(i)==0){ res=d; break; } } if(res!=-1||farthest[src].size()!=CHUNK_SIZE){ cout<<res<<"\n"; continue; } cout<<solve(src,blocked)<<"\n"; } } int main(){ ios::sync_with_stdio(false);cout.tie(NULL);cin.tie(NULL); //freopen("/Users/jakob/cp_testing/test.txt","r",stdin);//freopen("output.out","w",stdout); int t=1;//cin>>t; while(t--)solve(); return 0; } /* 5 6 3 1 2 2 4 3 4 1 3 3 5 4 5 4 1 1 5 2 2 3 2 3 1 4 5 1 3 0 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...