Submission #1234248

#TimeUsernameProblemLanguageResultExecution timeMemory
1234248hashdfdfhBitaro’s Party (JOI18_bitaro)C++20
100 / 100
915 ms216368 KiB
#include <bits/stdc++.h>
#define mid ((l+r)>>1)
using namespace std;
vector<int> vc[200005];
vector<pair<int,int>> nr[200005];
int B=150;
int ok[200005],dist[200005],tag[200005];
signed main(){
    ios::sync_with_stdio(false);
    cin.tie(0),cout.tie(0);
	int n,m,q; cin>>n>>m>>q;
	for(int i=1;i<=m;i++){
		int u,v; cin>>u>>v;
		vc[u].push_back(v);
	}
	for(int i=1;i<=n;i++){
		if(nr[i].size()<B){
			nr[i].push_back(make_pair(0,i));
		}
		for(auto v:vc[i]){
			vector<pair<int,int>> nw;
			int it1=0,it2=0;
			while(((it1!=nr[i].size())||(it2!=nr[v].size()))&&(nw.size()<B)){
				if(it1==nr[i].size()){
					if(tag[nr[v][it2].second]){
						it2++;
						continue; 
					}  tag[nr[v][it2].second]=1;
					nw.push_back(nr[v][it2]);
					it2++;
					continue;
				}
				if(it2==nr[v].size()){
					if(tag[nr[i][it1].second]){
						it1++;
						continue; 
					} tag[nr[i][it1].second]=1;
					auto t=nr[i][it1];
					t.first++;
					nw.push_back(t);
					it1++;
					continue;
				}
				if(nr[i][it1].first+1>nr[v][it2].first){
					if(tag[nr[i][it1].second]){
						it1++; 
						continue; 
					} tag[nr[i][it1].second]=1;
					auto t=nr[i][it1];
					t.first++;
					nw.push_back(t);
					it1++;
					continue;
				}
				else{
					if(tag[nr[v][it2].second]){
						it2++; 
						continue; 
					} tag[nr[v][it2].second]=1;
					nw.push_back(nr[v][it2]);
					it2++;
					continue;
				}
			}
			swap(nw,nr[v]);
			nw.clear();
			for(auto u:nr[v]) tag[u.second]=0;
		}
	}
//	for(int i=1;i<=n;i++,cout<<"\n") for(auto v:nr[i]) cout<<v.first<<" "<<v.second<<"  ";
	while(q--){
		int s,k; cin>>s>>k;
		if(k>=150){
			for(int i=1;i<=n;i++) ok[i]=1,dist[i]=-1;
			while(k--){
				int x; cin>>x; ok[x]=0;
			}
			for(int i=1;i<=n;i++){
				if(ok[i]) dist[i]=max(dist[i],0);
				if(dist[i]>=0){
					for(auto v:vc[i]){
						dist[v]=max(dist[v],dist[i]+1);
					}
				}
			}
			cout<<dist[s]<<"\n";
		}
		else{
			vector<int> nd;
			while(k--){
				int x; cin>>x; nd.push_back(x);
			}
			for(auto v:nd) tag[v]=1;
			int maxv=-1;
			for(auto v:nr[s]){
				if(!tag[v.second]){
					maxv=v.first;
					break;
				}
			}
			for(auto v:nd) tag[v]=0;
			cout<<maxv<<"\n"; 
		}
	} 
	return 0;
} 
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...