제출 #987025

#제출 시각아이디문제언어결과실행 시간메모리
987025Pyqe수천개의 섬 (IOI22_islands)C++17
35 / 100
76 ms26096 KiB
#include <bits/stdc++.h>
#include "islands.h"

using namespace std;

#define mp make_pair
#define fr first
#define sc second

long long n,m,dh[100069],an[100069],cyc[100069];
vector<long long> al[100069],vl[100069];
bitset<100069> vtd,vtd2;

void dfs(long long x)
{
	long long i,j,sz=al[x].size(),sz2,k,l;
	
	vtd[x]=1;
	vtd2[x]=1;
	for(i=0;i<sz;i++)
	{
		l=al[x][i];
		if(!vtd[l])
		{
			dh[l]=dh[x]+1;
			dfs(l);
		}
		if(vtd2[l])
		{
			if(dh[l]>dh[an[x]])
			{
				an[x]=l;
			}
		}
		else
		{
			if(dh[an[l]]>dh[an[x]])
			{
				an[x]=an[l];
			}
			cyc[x]=min(cyc[x]+cyc[l],2ll);
		}
		if(!vl[x].empty())
		{
			if(!cyc[l])
			{
				cyc[x]=min(cyc[x]+1,2ll);
			}
			sz2=vl[x].size();
			for(j=0;j<sz2;j++)
			{
				k=vl[x][j];
				cyc[k]=max(cyc[k],1ll);
			}
			vl[x].clear();
		}
	}
	vtd2[x]=0;
	if(vtd2[an[x]])
	{
		vl[an[x]].push_back(x);
	}
}

variant<bool,vector<int>> find_journey(int on,int om,vector<int> ka,vector<int> la)
{
	long long i,k,l;
	
	n=on;
	m=om;
	for(i=1;i<=m;i++)
	{
		k=ka[i-1]+1;
		l=la[i-1]+1;
		al[k].push_back(l);
	}
	dh[0]=-1;
	dfs(1);
	return cyc[1]==2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...