Submission #209539

#TimeUsernameProblemLanguageResultExecution timeMemory
209539coldEr66Airline Route Map (JOI18_airline)C++14
100 / 100
672 ms22824 KiB
#include "Alicelib.h"
#include <cassert>
#include <cstdio>
using namespace std;
#define REP1(i,n) for(int i=1;i<=n;i++)
#define REP(i,n) for(int i=0;i<n;i++)

void Alice( int N, int M, int A[], int B[] ){
	int V = N + 12; // N~N+9 ,N+10~N+11;
	int U = M;
	REP (i,N) {
		U += __builtin_popcount(i);
	}
	U += 9, U += 2*N;
	InitG(V,U);
	int idx = 0;
	REP (i,M) {
		MakeG(idx++,A[i],B[i]);
	}
	for (int i=N;i<N+9;i++) MakeG(idx++,i,i+1);
	REP (i,N) {
		MakeG(idx++,i,N+10), MakeG(idx++,i,N+11);
		int tmp = i;
		int bit = 0;
		while (tmp) {
			if (tmp&1) MakeG(idx++,i,N+bit);
			tmp >>= 1;
			bit++;
		}
	}
}
#include "Boblib.h"
#include <bits/stdc++.h>
using namespace std;
#define REP1(i,n) for(int i=1;i<=n;i++)
#define REP(i,n) for(int i=0;i<n;i++)
#define SZ(a) (int)a.size()

const int MAXn=1e3+20;

bitset<MAXn> bs[MAXn];
int bit[MAXn];
int deg[MAXn];
int id[MAXn];
vector<int> e[MAXn];
int p[MAXn];
void dfs(int x,int par,int b){
	// cout << "dfs " << x << endl;
	bit[x] = (1<<b);
	for (auto i:e[x]) {
		if (i == par || id[i] != 2) continue;
		dfs(i,x,b+1);
	}
}
void Bob( int V, int U, int C[], int D[] ){
	int N = V-12;
	REP (i,U) {
		bs[C[i]][D[i]] = 1;
		bs[D[i]][C[i]] = 1;
		e[C[i]].emplace_back(D[i]);
		e[D[i]].emplace_back(C[i]);
	}
	// REP (i,U) {
	// 	cout << i << ": ";
	// 	for (auto it:e[i]) {
	// 		cout << it << ' ';
	// 	}
	// 	cout << endl;
	// }
	int S = -1, T = -1;
	REP (i,V) {
		if (int(bs[i].count()) != N) continue;
		for (int j=i+1;j<V;j++) {
			if (int(bs[j].count()) != N) continue;
			if (int((bs[i] & bs[j]).count()) == N) {
				S = i, T = j;
				id[S] = 1, id[T] = 1;
			}
		}
	}
	// cout << S << ' ' << T << endl;
	vector<int> tmp;
	REP (i,V) {
		if (bs[S][i] == 0 && i != S && i != T) {
			tmp.emplace_back(i);
			id[i] = 2;
		}
	}
	int X = -1;
	REP (i,SZ(tmp)) {
		int cur = tmp[i];
		int cnt = 0;
		for (auto it:e[cur]) {
			if (id[it] == 2) cnt++;
		}
		// cout << "cnt " << cnt << endl;
		if (cnt == 1) {
			// cout << "HI" << endl;
			if (X == -1) X = cur;
			else if (SZ(e[cur]) > SZ(e[X])) X = cur;
		}
	}
	dfs(X,X,0);
	// REP (i,V) cout << i << ' ' << bit[i] << endl;
	int M = 0;
	REP (i,V) {
		if (id[i] == 0) {
			for (auto it:e[i]) {
				if (id[it] == 0) M++;
				if (id[it] == 2) {
					p[i] += bit[it];
				}
			}
		}
	}
	// REP (i,V) cout << "p: " << p[i] << endl;
	// REP (i,V) cout << "id: " << id[i] << endl;
	M /= 2;
	InitMap(N,M);
	REP (i,U) {
		if (id[C[i]] == 0 && id[D[i]] == 0) {
			MakeMap(p[C[i]],p[D[i]]);
		}
	}
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...