Submission #253709

#TimeUsernameProblemLanguageResultExecution timeMemory
253709Lawliet통행료 (IOI18_highway)C++17
51 / 100
237 ms29688 KiB
#include "highway.h"
#include <bits/stdc++.h>

using namespace std;
typedef long long int lli;

const int MAXN = 90010;

int n, m;
int A, B;

int depth[MAXN];
int ancEdge[MAXN];

lli dist;

vector<int> adj[MAXN];
vector<int> level[MAXN];
vector<int> indEdge[MAXN];

void DFSInit(int cur, int p, int d)
{
	depth[cur] = d;
	level[d].push_back( cur );

	for(int i = 0 ; i < (int)adj[cur].size() ; i++)
	{
		int viz = adj[cur][i];
		int ind = indEdge[cur][i];

		if( viz == p ) continue;

		ancEdge[viz] = ind;
		DFSInit( viz , cur , d + 1 );
	}
}

vector<int> activeNodes(int L, int R)
{
	vector<int> c( m , 0 );

	for(int p = L ; p <= R ; p++)
	{
		for(int i = 0 ; i < (int)level[p].size() ; i++)
		{
			int cur = level[p][i];
			c[ ancEdge[cur] ] = 1;
		}
	}

	return c;
}

vector<int> activeNodes(int L, int R, int d)
{
	vector<int> c( m , 0 );

	for(int i = L ; i <= R ; i++)
	{
		int cur = level[d][i];
		c[ ancEdge[cur] ] = 1;
	}

	return c;
}

int findMaxDepth()
{
	int l = 0;
  	int r = n - 1;

  	while( l < r )
  	{
  		int m = ( l + r )/2;

  		if( ask( activeNodes( 1 , m ) ) == dist*B ) r = m;
  		else l = m + 1;
  	}

  	return r;
}

int findNode(int depth)
{
	int l = 0;
	int r = (int)level[depth].size() - 1;

	while( l < r )
	{
		int m = ( l + r )/2;

		if( ask( activeNodes( 0 , m , depth ) ) != dist*A ) r = m;
		else l = m + 1;
	}

	return level[depth][r];
}

void find_pair(int N, vector<int> U, vector<int> V, int a, int b) 
{
	A = a; B = b;
	n = N; m = (int)U.size();

	dist = ask( vector<int>( m , 0 ) )/A;

	for(int i = 0 ; i < m ; i++)
	{
		adj[ U[i] ].push_back( V[i] );
		adj[ V[i] ].push_back( U[i] );

		indEdge[ U[i] ].push_back( i );
		indEdge[ V[i] ].push_back( i );
	}

  	DFSInit( 0 , 0 , 0 );

  	int maxDepth = findMaxDepth();
  	int S = findNode( maxDepth );

  	for(int i = 0 ; i < n ; i++)
  		level[i].clear();

  	DFSInit( S , S , 0 );
  	int T = findNode( dist );

  	answer( S , T );
}
#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...