Submission #105573

#TimeUsernameProblemLanguageResultExecution timeMemory
105573szawinisAirline Route Map (JOI18_airline)C++17
100 / 100
845 ms31048 KiB
#include "Alicelib.h"
#include <cassert>
#include <cstdio>
#include <vector>
#include <utility>
#include <iostream>
const int K = 10;

void Alice( int N, int M, int A[], int B[] ){
    if(N == 1) {
        InitG(N, M);
        return;
    }
    if(N == 2) {
        InitG(N, M);
        if(M) MakeG(0, 0, 1);
        return;
    }
	std::vector<std::pair<int, int> > edges;
	for(int i = 0; i < M; i++) {
		edges.emplace_back(A[i], B[i]); // original graph
	}
	for(int i = 0; i < N; i++) {
		for(int j = 0; j < K; j++) {
			if(!((i + 1) >> j & 1)) continue; // make graph 1-indexed, so connect to corresponding nodes
			edges.emplace_back(i, N + j); // links between bit vertices and origianl vertices
		}
	}
	for(int j = 0; j < K - 1; j++) edges.emplace_back(N + j, N + j + 1); // links between bit vertices
	for(int i = 0; i < N; i++) {
		edges.emplace_back(i, N + K); // N + 10 is the special vertex
	}
	edges.emplace_back(N + K, N + K + 1); // N + 11 is the one-degree vertex
	int curr_idx = 0;
	InitG(N + K + 2, edges.size());
//    for(auto p: edges) std::cerr << p.first << ' ' << p.second << std::endl;
	for(auto p: edges) MakeG(curr_idx++, p.first, p.second);
}
#include "Boblib.h"
#include <cassert>
#include <cstdio>
#include <vector>
#include <algorithm>
#include <iostream>
const int K = 10;

void Bob(int N, int M, int A[], int B[]) {
    if(N == 1) {
        InitMap(N, M);
        return;
    }
    if(N == 2) {
        InitMap(N, M);
        for(int i = 0; i < M; i++) MakeMap(A[i], B[i]);
        return;
    }
    std::vector<int> g[N];
    for(int i = 0; i < M; i++) {
        g[A[i]].push_back(B[i]);
        g[B[i]].push_back(A[i]);
//        std::cerr << A[i] << ' ' << B[i] << ' ' << std::endl;
    }

    //find special vertex
    std::vector<int> deg1;
    for(int i = 0; i < N; i++) if(g[i].size() == 1) deg1.push_back(i);
    assert(deg1.size() <= 2);
    int very_special_vertex = deg1[0]; // vertex of degree 1 that points to the special vertex
    int special_vertex = g[deg1[0]][0];
    if(deg1.size() == 2) {
        if(g[special_vertex].size() != N - K - 1) {
            very_special_vertex = deg1[1];
            special_vertex = g[deg1[1]][0];
        }
    }
//    std::cerr << "specials " << very_special_vertex << ' ' << special_vertex << std::endl;
//    std::cerr << "bit_vertices " << std::endl;

    //find bit vertices
    std::vector<int> bit_vertices;
    std::vector<bool> is_bit_vertex(N);
    for(int i = 0; i < N; i++) if(i != special_vertex) {
        if(std::find(g[i].begin(), g[i].end(), special_vertex) == g[i].end()) {
            bit_vertices.push_back(i);
            is_bit_vertex[i] = true;
        }
    }
    assert(bit_vertices.size() == K);

    int mx_bit_vertex = *min_element(bit_vertices.begin(), bit_vertices.end(), [&] (int i, int j) { return g[i].size() < g[j].size(); });
    std::vector<int> vals(N);
    for(int ord = K - 1, curr = mx_bit_vertex; ord >= 0; ord--) {
//        std::cerr << curr << ' ' << ord << std::endl;
        for(int v: g[curr]) {
            assert(v != very_special_vertex && v != special_vertex);
            if(is_bit_vertex[v]) continue;
            vals[v] |= 1 << ord;
        }

        for(int v: g[curr]) {
            if(is_bit_vertex[v]) {
                g[v].erase(std::find(g[v].begin(), g[v].end(), curr));
                curr = v;
                break;
            }
        }
    }

    auto in_org_graph = [&] (int v) -> bool { return v != very_special_vertex && v != special_vertex && !is_bit_vertex[v]; };
    std::vector<std::pair<int,int> > ans;
    for(int i = 0; i < M; i++) {
        if(in_org_graph(A[i]) && in_org_graph(B[i])) ans.emplace_back(vals[A[i]] - 1, vals[B[i]] - 1);
    }
    InitMap(N - K - 2, ans.size());
//    for(auto p: ans) std::cerr << p.first << ' ' << p.second << std::endl;
    for(auto p: ans) MakeMap(p.first, p.second);
}

Compilation message (stderr)

Bob.cpp: In function 'void Bob(int, int, int*, int*)':
Bob.cpp:33:37: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         if(g[special_vertex].size() != N - K - 1) {
            ~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...