Submission #233961

#TimeUsernameProblemLanguageResultExecution timeMemory
233961kshitij_sodaniBitaro’s Party (JOI18_bitaro)C++17
100 / 100
1418 ms264312 KiB
#include <bits/stdc++.h>
using namespace std;
typedef int64_t llo;
#define mp make_pair
#define pb push_back
#define a first
#define b second
int n,m,q,aa,bb;
int vis[100001];
vector<int> adj[100001];
int x;
const int ss=316;
int dp[100001];
int calc(int ind){
	for(int i=0;i<ind+1;i++){
		dp[i]=0;
		if(vis[i]){
			dp[i]=-1;
		}
		for(auto j:adj[i]){
			if(dp[j]!=-1){
				dp[i]=max(dp[i],dp[j]+1);
			}
		}
	}
	return dp[ind];
}
pair<int,int> dist[100001][ss];
int ind[100001];
vector<int> freq[100001];
int pre(){
	for(int i=0;i<n;i++){
		//priority_queue<pair<int,int>> sso;
		int ma=0;
		for(auto j:adj[i]){
			for(int k=0;k<ind[j];k++){
				//sso.push(dist[j][k]);
				freq[dist[j][k].a+1].pb(dist[j][k].b);
	//			cout<<dist[j][k].a+1<<"  "<<dist[j][k].b<<endl;
				ma=max(ma,dist[j][k].a+1);
			}
		}
		//cout<<ma<<":"<<endl;
		int co=0;
		freq[0].pb(i);
		while(co<ss){
			if(freq[ma].size()==0){
				ma-=1;
			}
		//	cout<<ma<<endl;
			if(ma<0){
				break;
			}
			int tt=freq[ma].back();
			if(vis[tt]){
				freq[ma].pop_back();
				continue;
			}
			vis[tt]=1;

			dist[i][co]={ma,tt};
			freq[ma].pop_back();
		//	cout<<i<<","<<ma<<","<<tt<<endl;
			co+=1;
		}

		for(int j=0;j<co;j++){
			vis[dist[i][j].b]=0;
		}
		/*if(co<ss){
			dist[i][co]={0,i};
			co+=1;
		}*/
		ind[i]=co;
		for(auto j:adj[i]){
			for(int k=0;k<ind[j];k++){
				if(freq[dist[j][k].a+1].size()){
					freq[dist[j][k].a+1].pop_back();
				}
			}
		}
	//	cout<<i<<"  "<<co<<endl;
	}
}
int main(){
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	cin>>n>>m>>q;
	for(int i=0;i<n;i++){
		vis[i]=0;
	}
	for(int i=0;i<m;i++){
		cin>>aa>>bb;
		adj[bb-1].pb(aa-1);
	}

	pre();

	int indd,nn;
	for(int ii=0;ii<q;ii++){
		cin>>indd>>nn;
		indd-=1;
		vector<int> cur;
		int co=0;
		for(int j=0;j<nn;j++){
			cin>>x;
			x-=1;
		//	if(adj[x].size()==0){
				vis[x]=1;
				cur.pb(x);
				co+=1;
		//	}
		}
		if(co>=ss){
			cout<<calc(indd)<<endl;
		}
		else{
			int st=0;
			for(int i=0;i<ind[indd];i++){
				if(vis[dist[indd][i].b]){
					continue;
				}
				st=1;
				cout<<dist[indd][i].a<<endl;
				break;
			}
			if(st==0){
				cout<<-1<<endl;
			}
		}
		for(auto j:cur){
			vis[j]=0;
		}
	}



	return 0;
}

Compilation message (stderr)

bitaro.cpp: In function 'int pre()':
bitaro.cpp:84:1: warning: no return statement in function returning non-void [-Wreturn-type]
 }
 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...