Submission #846568

#TimeUsernameProblemLanguageResultExecution timeMemory
846568PanosPaskAirline Route Map (JOI18_airline)C++14
100 / 100
607 ms31944 KiB
#include "Alicelib.h"
#include <cassert>
#include <cstdio>
#define pb push_back
#define CHECK_BIT(val, pos) (val & (1 << pos))
#include <vector>

const int BITS = 10;

using namespace std;

int V, E;

vector<int> C;
vector<int> D;

void Alice( int N, int M, int A[], int B[] ){
	// Just create some new nodes

	V = N;
	E = M;

	// First the bitnodes
	for (int b = 0; b < BITS; b++) {
		for (int i = 0; i < N; i++)
			if (CHECK_BIT(i, b)) {
				C.pb(i);
				D.pb(V);
			}
		if (b) {
			C.pb(V);
			D.pb(V - 1);
		}
		V++;
	}

	// Then the one with all the connections
	for (int i = 1; i <= BITS; i++) {
		C.pb(V);
		D.pb(V - i);
	}
	V++;

	// Then the one with all but this
	for (int i = 0; i < V - 1; i++) {
		C.pb(V);
		D.pb(i);
	}
	V++;

	InitG(V, C.size() + M);
	for (int i = 0; i < M; i++)
		MakeG(i, A[i], B[i]);
	for (int i = 0; i < C.size(); i++)
		MakeG(i + M, C[i], D[i]);

	return;;
}
#include "Boblib.h"
#include <cassert>
#include <cstdio>
#include <vector>
#include <bits/stdc++.h>
#define pb push_back

const int BITS = 10;

using namespace std;

// Bit nodes, in little endian order
vector<int> bitnodes;
vector<int> real_order;
vector<vector<int>> adj_list;

vector<int> actual;

int edge_ttl = 0;

vector<bool> banned;

int inside(int a, vector<int>& v)
{
	int p = lower_bound(v.begin(), v.end(), a) - v.begin();
	if (p != v.size() && v[p] == a)
		return true;

	return false;
}

int decode(int node)
{
	int res = 0;
	for (int i = 0; i < BITS; i++) {
		if (inside(bitnodes[i], adj_list[node])) {
			res += (1 << i);
			edge_ttl--;
		}
	}

	return res;
}

void find_next_bitnode(int node, int par)
{
	for (auto i : bitnodes) {
		if (i == node || i == par)
			continue;

		if (inside(i, adj_list[node])) {
			real_order.pb(i);
			find_next_bitnode(i, node);
			return;
		}
	}
}

void Bob( int V, int U, int C[], int D[] )
{
	bitnodes.clear();
	adj_list.clear();
	actual.clear();

	edge_ttl = U;

	adj_list.resize(V);
	banned.assign(V, false);
	actual.assign(V, -1);

	for (int i = 0; i < U; i++) {
		adj_list[C[i]].pb(D[i]);
		adj_list[D[i]].pb(C[i]);
	}

	int outl = -1;
	for (int i = 0; i < V; i++) {
		if (adj_list[i].size() == V - 2)
			outl = i;

		sort(adj_list[i].begin(), adj_list[i].end());
	}

	// Find the node not connected to outlier
	int curp = 0;
	int special = -1;
	for (int i = 0; i < V - 1; i++) {
		if (i == outl)
			continue;

		if (adj_list[outl][curp++] != i) {
			special = i;
			break;
		}
	}
	if (special == -1)
		special = V - 1;

	banned[special] = banned[outl] = true;
	edge_ttl -= adj_list[special].size() + adj_list[outl].size();
	edge_ttl -= BITS - 1;

	// Found special, find bitnodes
	for (auto neigh : adj_list[special]) {
		bitnodes.pb(neigh);
		banned[neigh] = true;
	}

	// Find correct ordering
	// Find one of the starts

	int st = -1;
	for (int i = 0; i < BITS; i++) {
		int cnt = 0;
		for (int j = 0; j < BITS; j++) {
			if (inside(bitnodes[j], adj_list[bitnodes[i]]))
				cnt++;
		}
		if (cnt == 1)
			st = bitnodes[i];
	}
	real_order.pb(st);
	find_next_bitnode(st, -1);

	if (adj_list[real_order.front()].size() < adj_list[real_order.back()].size())
		reverse(real_order.begin(), real_order.end());
	bitnodes = real_order;

	for (int i = 0; i < V; i++) {
		if (!banned[i])
			actual[i] = decode(i);
	}

	InitMap(V - BITS - 2, edge_ttl);

	for (int i = 0; i < V; i++)
		for (auto j : adj_list[i]) {
			if (!banned[i] && !banned[j] && actual[i] < actual[j])
				MakeMap(actual[i], actual[j]);
		}
}

Compilation message (stderr)

Alice.cpp: In function 'void Alice(int, int, int*, int*)':
Alice.cpp:54:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   54 |  for (int i = 0; i < C.size(); i++)
      |                  ~~^~~~~~~~~~

Bob.cpp: In function 'int inside(int, std::vector<int>&)':
Bob.cpp:26:8: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   26 |  if (p != v.size() && v[p] == a)
      |      ~~^~~~~~~~~~~
Bob.cpp: In function 'void Bob(int, int, int*, int*)':
Bob.cpp:78:26: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
   78 |   if (adj_list[i].size() == V - 2)
      |       ~~~~~~~~~~~~~~~~~~~^~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...