Submission #420494

#TimeUsernameProblemLanguageResultExecution timeMemory
420494kostia244Airline Route Map (JOI18_airline)C++17
100 / 100
846 ms25072 KiB
#include "Alicelib.h"
#include<bits/stdc++.h>
using namespace std;

void Alice(int n, int m, int A[], int B[] ){
	if(n < 3 || m == 0) {
		InitG(n, m);
		for(int i = 0; i < m; i++)
			MakeG(i, A[i], B[i]);
		return;
	}

	vector<int> label(3024);
	for(int z = 0, i = 0; i < 1000; i++) {
		while(z > 1 && !(z&(z-1))) z++;
		label[i] = z ? z : 1023;
		z++;
		if(i < 5) {
			//cout << i << " = " << label[i] << endl;
		}
	}

	vector<array<int, 2>> edges;
	vector<int> baka(n);
	for(int i = 0; i < m; i++) {
		baka[A[i]]++;
		baka[B[i]]++;
	}
	for(int i = 0; i < m; i++) edges.push_back({A[i], B[i]});
	for(int i = 0; i < n; i++) if(baka[i]) edges.push_back({n, i});
	for(int i = 0; i < n; i++) if(!baka[i]) {
		edges.push_back({i, n+2});
		edges.push_back({i, n+3});
		edges.push_back({i, n+4});
		edges.push_back({i, n+11});
	}
	edges.push_back({n+1, n});
	for(int bit = 0; bit < 10; bit++) {
		if(bit)
			edges.push_back({n+1+bit, n+2+bit});
		for(int i = 0; i < n; i++) if(baka[i] && (label[i]>>bit)&1) {
			edges.push_back({n+2+bit, i});
		}
	}
	//for(auto [u, v] : edges) cout << u << " " << v << endl;
	InitG(n+12, edges.size());
	for(int i = 0; i < edges.size(); i++)
		MakeG(i, edges[i][0], edges[i][1]);
}

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

void Bob( int V, int U, int C[], int D[] ){
	if(V < 3 || U == 0) {
		InitMap(V, U);
		for(int i = 0; i < U; i++)
			MakeMap(C[i], D[i]);
		return;
	}
	
	vector<int> label(3024);
	for(int z = 0, i = 0; i < 1000; i++) {
		while(z > 1 && !(z&(z-1))) z++;
		label[z ? z : 1023] = i;
		z++;
	}

	vector<vector<int>> g(V);
	vector<int> real(V, -1), crap(V, 0);
	for(int i = 0; i < U; i++) {
		g[C[i]].push_back(D[i]);
		g[D[i]].push_back(C[i]);
	}
	int sun = 0;
	while(g[sun].size()!=1) sun++;
	int psun = sun;
	sun = g[sun][0];
	for(auto i : g[sun]) if(g[i].size()>1)real[i] = 0;
	int start = -1, prev = -1;
	int isol = (V-12) - (g[sun].size()-1);
	if(isol == 0) {
		for(int i = 0; i < V; i++) if(!real[i]) {
			int popcnt = -1;
			for(int j : g[i]) if(real[j]  && j != sun) {
				if(popcnt == -1) popcnt = j;
				if(popcnt != j) popcnt = -2;
			}
			if(popcnt >= 0) {
				start = popcnt;
				break;
			}
		}
	} else {
		vector<int> fdeg(V);
		for(int i = 0; i < V; i++) if(real[i]) {
			for(int j : g[i]) fdeg[j]++;
		}
		for(int i = 0; i < V; i++) if(real[i] && i != sun && i != psun) {
			int has2 = 0, has4 = 0;
			for(int j : g[i]) if(real[j]) {
				has2 |= fdeg[j] == 2;
				has4 |= fdeg[j] == 4;
			}
			//cout << i << " " << has2 << " " << has4 << " " << g[i].size() << endl;
			if(has2 && has4 && fdeg[i] == 1+isol) {
				start = i;
				for(auto j : g[i]) if(real[j] && fdeg[j] == 4)
					crap[j] = 1;
				break;
			}
		}
	}


	//cout << start << "hm\n" << endl;
	vector<int> bits {start};
	while(bits.size() < 10) {
		for(auto i : g[start]) if(real[i] && i != prev && !crap[i]) {
			prev = start;
			start = i;
			break;
		}
		bits.push_back(start);
	}
	if(isol) reverse(bits.begin(), bits.end());

	for(int i = 0; i < 10; i++) {
		for(int j : g[bits[i]]) if(real[j] != -1)
			real[j] += 1<<i;
	}

	//for(auto i : real) cout << i << " "; cout << endl;
	for(int &i : real) if(i != -1) i = label[i];
	//for(auto i : real) cout << i << " "; cout << endl;

	int ed = 0;
	for(int i = 0; i < U; i++)
		ed += real[C[i]] >= 0 && real[D[i]] >= 0;
	InitMap(V-12, ed );
	for(int i = 0; i < U; i++) {
		if(real[C[i]] >= 0 && real[D[i]] >= 0)
			MakeMap(real[C[i]], real[D[i]]);
	}
}

Compilation message (stderr)

Alice.cpp: In function 'void Alice(int, int, int*, int*)':
Alice.cpp:47:19: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::array<int, 2> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   47 |  for(int i = 0; i < edges.size(); i++)
      |                 ~~^~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...