Submission #1272227

#TimeUsernameProblemLanguageResultExecution timeMemory
1272227thunoproConnecting Supertrees (IOI20_supertrees)C++20
100 / 100
102 ms26152 KiB
#include "supertrees.h"
#include <vector>
#include<bits/stdc++.h>
using namespace std ; 
#define maxn 200009
#define ll long long 
#define pb push_back 
#define fi first 
#define se second 
#define left id<<1
#define right id<<1|1 
#define re exit(0); 
#define _lower(x) lower_bound(v.begin(),v.end(),x)-v.begin()+1 
#define TIME ( 1.0*clock() / CLOCKS_PER_SEC )
const int mod = 1e9+7 ;
const int INF = 1e9 ; 

typedef vector<int> vi ; 
typedef pair<int,int> pii ; 
typedef vector<pii> vii ; 

template < typename T > void chkmin ( T &a , T b ) { if ( a > b ) a = b ; } 
template < typename T > void chkmax ( T &a , T b ) { if ( a < b ) a = b ; } 

void add ( int &a , int b ) 
{
	a += b ; 
	if ( a >= mod ) a -= mod ; 
	if ( a < 0 ) a += mod ; 
}

int n , ma , vis [maxn] ; 
vi block ,edge , circle ;
vector<vi> graph,res ;

void add_edge ( int u , int v ) { res [u][v] = res [v][u] = 1 ; } 
void dfs ( int u ) 
{
	vis [u] = 1 ; 
	block.pb (u) ; 
	for ( int v = 0 ; v < n ; v ++ ) 
	{
		ma = max (ma,graph[u][v]) ; 
		if ( !vis [v] && graph [u][v] ) dfs (v) ; 
	}
}

void dfsCircle ( int u ) 
{
	vis [u] = 2 ; 
	edge.pb (u) ; 
	for ( int v = 0 ; v < n ; v ++ ) if ( vis [v] == 1 && graph [u][v] == 1 ) dfsCircle (v) ; 
}
int construct( vector<vi> p ) {
	graph = p , n = p.size () ; res.resize (n) ; 
	for ( int i = 0 ; i < n ; i ++ ) res [i].resize (n) ; 
	for ( int i = 0 ; i < n ; i ++ ) 
	{
		if ( vis [i] ) continue ; 
		ma = 1 ; block.clear() ; dfs (i) ; 
		if ( ma == 3 ) return 0 ; 
		int sz = block.size () ; 
		for ( int j = 1 ; j < sz ; j ++ ) 
		{
			for ( int k = 0 ; k < j ; k ++ ) 
			{
				if ( !graph[block[j]][block[k]] ) return 0 ; 
			}
		}
		if ( ma == 1 ) for ( int j = 1 ; j < sz ; j ++ ) add_edge (block[0],block[j]) ; 
		else 
		{
			circle.clear() ; 
			for ( int r = 0 , j = block [r] ; r < sz ; r ++ , j = block [r] ) 
			{
				if ( vis [j] != 1 ) continue ; 
				edge.clear() ; 
				dfsCircle (j) ; 
				int sz2 = edge.size() ; 
				for ( int k = 1 ; k < sz2 ; k ++ ) 
				{
					for ( int l = 0 ; l < k ; l ++ ) 
					{
						if ( graph[edge[k]][edge[l]] != 1 ) return 0 ; 
					}
					add_edge (edge[0],edge[k]) ; 
				}
				circle.pb(edge[0]) ; 
			}
			if ( circle.size () <= 2 ) return 0 ; 
			int sz3 = circle.size () ; 
			for ( int j = 0 ; j < sz3 ; j ++ ) add_edge (circle[j],circle[(j+1)%sz3]) ; 
		}
	}
	build (res) ; 
	return 1;
}
#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...
#Verdict Execution timeMemoryGrader output
Fetching results...