Submission #1192969

#TimeUsernameProblemLanguageResultExecution timeMemory
1192969justinlgl20Bitaro’s Party (JOI18_bitaro)C++20
7 / 100
2099 ms225988 KiB
#include <bits/extc++.h>
using namespace std;
using namespace __gnu_pbds;

#define all(x) (x).begin(), (x).end()

ostream& operator<<(ostream& os,pair<int,int>v){
	os<<"("<<v.first<<" "<<v.second<<")";return os;
}
template<template<typename> class Container, typename T>
ostream& operator<<(ostream& os,Container<T> v){
	int s=v.size();os<<"{";for(auto i:v)os<<i<<(--s?", ":"}");return os;
}

void _print() {
	cerr<<"]\n";
}
template<typename T,typename... V>
void _print(T t, V... v){
	cerr<<t;if(sizeof...(v))cerr<<", ";_print(v...);
}
#ifdef DEBUG
#define dbg(x...)cerr<<"\e[91m"<<__func__<<":"<<__LINE__<<" "<<"["<<#x<<"] = [";_print(x);cerr<<"\e[39m"<<"\n";
#else
#define dbg(x...)
#endif
#define pii pair<int,int>
#define f first
#define s second

const int SQ = 350;

vector<int> pull[100005];
vector<pii> best[100005];

int32_t main() {
	// for each cantde, keep track of the sqrt best cantdes that can go to it
	int n,m,q;cin>>n>>m>>q;
	for(int i=0;i<m;i++){
		int u,v;cin>>u>>v;pull[v].emplace_back(u);
	}
	for(int i=1;i<=n;i++){
		best[i].emplace_back(0, i);
		gp_hash_table<int,int> b;
		for(int k:pull[i]){
			// merge best[i] with best[k] and take the sqrt best things (can't be same element)
			for(pii j:best[k]){
				b[j.s]=max(b[j.s],j.f+1);
			}
		}
		for(pii j:b){
			best[i].emplace_back(j.s,j.f);
		}
		sort(all(best[i]));reverse(all(best[i]));best[i].resize(min((int)best[i].size(),SQ));
		dbg(i,best[i]);
	}
	dbg("DONE");
	while(q--){
		int dest,y;cin>>dest>>y;vector<int> cant(y);for(int i=0;i<y;i++)cin>>cant[i];
		dbg(dest,cant);
		gp_hash_table<int,int> bad;
		for(int i:cant)bad[i]=1;
		if(y>=SQ){
			dbg("BEEG");
			vector<int> best(n+4,0);
			for(int i:cant)best[i]=-1e9;
			for(int i=1;i<=n;i++){
				for(int j:pull[i]){
					best[i]=max(best[i],best[j]+1);
				}
				dbg(i,best[i]);
			}
			if(best[dest]<0){
				cout<<"-1\n";
			}else{
				cout<<best[dest]<<"\n";
			}
		}else{
			bool done=0;
			for(int i=0;i<best[dest].size();i++){
				if(!bad[best[dest][i].s]){
					done=1;
					cout<<best[dest][i].f<<"\n";
					break;
				}
			}
			if(!done){
				cout<<"-1\n";
			}
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...