Submission #56652

#TimeUsernameProblemLanguageResultExecution timeMemory
56652gs14004Airline Route Map (JOI18_airline)C++17
100 / 100
725 ms30928 KiB
#include "Alicelib.h"
#include <bits/stdc++.h>
using namespace std;

void Alice( int N, int M, int A[], int B[] ){
	using pi = pair<int, int>;
	if(N == 1){
		InitG(1, 0);
		return;
	}
	if(N == 2 && M == 0){
		InitG(2, 0);
		return;
	}
	if(N == 2 && M == 1){
		InitG(3, 0);
		return;
	}
	int idx[1024] = {};
	int pcnt[1024] = {};
	for(int i=1; i<=1023; i++) pcnt[i] = pcnt[i/2] + i%2;
	int ptr = 0;
	for(int i=0; i<N; i++){
		while(pcnt[ptr] >= 9) ptr++;
		idx[i] = ptr++;
	}
	vector<pi> v;
	for(int i=0; i<M; i++) v.emplace_back(A[i], B[i]);
	for(int i=0; i<N; i++) v.emplace_back(i, N);
	for(int i=0; i<9; i++) v.emplace_back(N + i + 1, N + i + 2);
	for(int i=0; i<10; i++){
		for(int j=0; j<N; j++){
			if((idx[j] >> i) & 1) v.emplace_back(j, N + i + 1);
		}
	}
	for(int i=0; i<N+11; i++){
		if(i != N) v.emplace_back(i, N + 11);
	}
	InitG(N + 12, v.size());
	for(int i=0; i<v.size(); i++){
		MakeG(i, v[i].first, v[i].second);
	}
}

#include "Boblib.h"
#include <bits/stdc++.h>
using namespace std;
static const int MAXN = 1500;

void Bob( int V, int U, int C[], int D[] ){
	using pi = pair<int, int>;
	if(V <= 3){
		if(V == 1) InitMap(1, 0);
		if(V == 2) InitMap(2, 0);
		if(V == 3) InitMap(2, 1), MakeMap(0, 1);
		return;
	}
	int chk[MAXN] = {};
	int real_idx[MAXN] = {};
	vector<int> gph[MAXN];
	int idx[1024] = {};
	int pcnt[1024] = {};
	for(int i=1; i<=1023; i++) pcnt[i] = pcnt[i/2] + i%2;
	int ptr = 0;
	for(int i=0; i<V-12; i++){
		while(pcnt[ptr] >= 9) ptr++;
		idx[i] = ptr++;
	}
	for(int i=0; i<U; i++){
		gph[C[i]].push_back(D[i]);
		gph[D[i]].push_back(C[i]);
	}
	int mxp = 0;
	set<int> s;
	for(int i=0; i<V; i++){
		s.insert(i);
		if(gph[i].size() > gph[mxp].size()) mxp = i;
	}
	s.erase(mxp);
	for(auto &i : gph[mxp]) s.erase(i);
	int src = *s.begin();
	for(auto &i : gph[src]) chk[i] = 1;
	chk[mxp] = -1;
	chk[src] = -1;
	vector<int> two_end;
	for(int i=0; i<V; i++){
		if(!chk[i]){
			int cnt = 0;
			for(auto &j : gph[i]){
				if(chk[j] == 0) cnt++;
			}
			if(cnt == 1) two_end.push_back(i);
		}
	}
	assert(two_end.size() == 2);
	if(gph[two_end[0]].size() > gph[two_end[1]].size()) swap(two_end[0], two_end[1]);
	int msk = (1<<9);
	for(int i=two_end[0]; msk; ){
		if(i == -1){
			InitMap(-1, 0);
			return;
		}
		chk[i] = 2;
		int nxt = -1;
		for(auto &j : gph[i]){
			if(!chk[j]){
				nxt = j;
			}
			else if(chk[j] == 1){
				real_idx[j] |= msk;
			}
		}
		msk >>= 1;
		i = nxt;
	}
	for(int i=0; i<V; i++){
		if(chk[i] != 1) continue;
		for(int j=0; j<1024; j++){
			if(real_idx[i] == idx[j]){
				real_idx[i] = j;
				break;
			}
		}
	}
	vector<pi> result_edge;
	for(int i=0; i<U; i++){
		if(chk[C[i]] == 1 && chk[D[i]] == 1){
			result_edge.emplace_back(real_idx[C[i]], real_idx[D[i]]);
		}
	}
	InitMap(V - 12, result_edge.size());
	for(auto &i : result_edge) MakeMap(i.first, i.second);
}

Compilation message (stderr)

Alice.cpp: In function 'void Alice(int, int, int*, int*)':
Alice.cpp:40:16: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
  for(int i=0; i<v.size(); i++){
               ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...