Submission #648793

#TimeUsernameProblemLanguageResultExecution timeMemory
648793JohannAirline Route Map (JOI18_airline)C++14
100 / 100
735 ms21392 KiB
#include "Alicelib.h"
#include <cassert>
#include <cstdio>

#include "bits/stdc++.h"
using namespace std;

typedef pair<int, int> pii;
typedef vector<pii> vpii;
#define sz(x) (int)(x).size()

void Alice(int N, int M, int A[], int B[])
{
	vpii edges;
	// Knoten sind 1 Indiziert...
	// von Z := 0 zu allen Knoten von G
	for (int i = 1; i <= N; ++i)
		edges.push_back({0, i});
	// Zwischen den Count Bits
	for (int b = 0; b + 1 < 10; ++b)
		edges.push_back({N + b + 1, N + b + 2});
	// Kontrollbit K = N+11 zu Z = 0
	edges.push_back({0, N + 11});
	// für alle anderen Knoten im Graph:
	for (int v = 1; v <= N; ++v)
		for (int b = 0; b < 10; ++b)
			if (v & (1 << b))
				edges.push_back({v, N + b + 1});
	// Ausfüllen
	InitG(N + 12, M + sz(edges));
	int idx = 0;
	for (int i = 0; i < M; ++i)
		MakeG(idx++, A[i] + 1, B[i] + 1);
	for (pii e : edges)
		MakeG(idx++, e.first, e.second);
}
#include "Boblib.h"
#include <cassert>
#include <cstdio>

#include "bits/stdc++.h"
using namespace std;

typedef pair<int, int> pii;
typedef vector<pii> vpii;
typedef vector<int> vi;
typedef vector<vi> vvi;
typedef vector<bool> vb;
#define sz(x) (int)(x).size()

void dfs(vvi &adj, int v, vi &countBits, vi &rename)
{
	rename[v] = -2;
	countBits.push_back(v);
	for (int u : adj[v])
	{
		if (rename[u] == -1)
			dfs(adj, u, countBits, rename);
	}
}

void Bob(int V, int U, int C[], int D[])
{
	vvi adj(V);
	for (int i = 0; i < U; ++i)
		adj[C[i]].push_back(D[i]), adj[D[i]].push_back(C[i]);

	int k = -1;
	for (int v = 0; v < V; ++v)
		if (sz(adj[v]) == 1 && sz(adj[adj[v][0]]) == V - 11)
			// es kann maximal zwei Kandidaten sz(adj[v]) == 1 geben (k und cnt_9)
			k = v;
	int z = adj[k][0];

	vi rename(V, -1);
	for (int x : adj[z])
		rename[x] = 0;			// alle Normalen Knoten und k werden mit 0 bennant
	rename[k] = rename[z] = -2; // k wieder extra Rolle

	pii cnt0 = {-1, -1}; // { degree , node }
	for (int v = 0; v < V; ++v)
		if (rename[v] == -1) // alle Count Bits
		{
			int neighbors = 0;
			for (int x : adj[v])
				if (rename[x] == -1)
					++neighbors;
			if (neighbors == 1)
				cnt0 = max(cnt0, {sz(adj[v]), v});
		}
	vi countBits;
	dfs(adj, cnt0.second, countBits, rename);

	for (int b = 0; b < 10; ++b)
	{
		for (int v : adj[countBits[b]])
			if (rename[v] >= 0)
				rename[v] += (1 << b);
	}

	int M = 0;
	for (int v = 0; v < V; ++v)
		// Alle Kanten zwischen den Kontrollknoten und den Normalen werden enternt
		M += sz(adj[v]) * ((rename[v] >= 0) ? 1 : -1);
	M /= 2;
	M += 1 + 9; // Kanten zwischen den Knotrollknoten, müssen noch addiert werden.
	InitMap(V - 12, M);
	for (int v = 0; v < V; ++v)
	{
		if (rename[v] < 0)
			continue;
		for (int u : adj[v])
			if (rename[u] >= 0 && rename[v] > rename[u])
				MakeMap(rename[v] - 1, rename[u] - 1);
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...