Submission #130203

#TimeUsernameProblemLanguageResultExecution timeMemory
130203BTheroAirline Route Map (JOI18_airline)C++17
100 / 100
1029 ms38760 KiB
// Why am I so dumb? :c
// chrono::system_clock::now().time_since_epoch().count()

//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include "Alicelib.h"

#define pb push_back
#define mp make_pair

#define all(x) (x).begin(), (x).end()

#define fi first
#define se second

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef pair<int, int> pii;   
template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

static const int MAXN = (int)2e3 + 5;

static pii e[MAXN * MAXN];

static int n, m;

void buildGood() {
    vector<pii> _e;

    for (int i = 0; i < m; ++i) {
        _e.pb(e[i]);
    }

    for (int i = 0; i < n; ++i) {
        for (int j = 0; j < 10; ++j) {
            if (i & (1 << j)) {
                _e.pb(mp(i, n + j));
            }
        }
    }

    for (int i = 0; i < 10; ++i) {
        if (i + 1 < 10) {
            _e.pb(mp(n + i, n + i + 1));
        }

        _e.pb(mp(n + i, n + 10));
    }

    for (int i = 0; i < n + 10; ++i) {
        _e.pb(mp(i, n + 11));
    }

    InitG(n + 12, _e.size());

    for (int i = 0; i < _e.size(); ++i) {
        MakeG(i, _e[i].fi, _e[i].se);
    }
}

void Alice(int _n, int _m, int A[], int B[]) {
    n = _n;
    m = _m;

    for (int i = 0; i < m; ++i) {
        e[i] = mp(A[i], B[i]);
    }

    buildGood();
}

// Why am I so dumb? :c
// chrono::system_clock::now().time_since_epoch().count()

//#pragma GCC optimize("Ofast")
//#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")

#include<bits/stdc++.h>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#include "Boblib.h"

#define pb push_back
#define mp make_pair

#define all(x) (x).begin(), (x).end()

#define fi first
#define se second

using namespace std;
using namespace __gnu_pbds;
 
typedef long long ll;   
typedef pair<int, int> pii;
template<typename T> using ordered_set = tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

static const int MAXN = (int)2e3 + 5;
static const int INF = (int)1e9;

static int id[MAXN], deg[MAXN], tp[MAXN];

static bool adj[MAXN][MAXN];

static pii e[MAXN * MAXN];

static int dep[MAXN];

static int n, m;

void solve() {
    vector<pii> _e;

    for (int i = 0; i < m; ++i) {
        int u = e[i].fi;
        int v = e[i].se;
        ++deg[u];
        ++deg[v];
        adj[u][v] = 1;
        adj[v][u] = 1;
    }

    int boss = 0, me = 0;

    while (deg[boss] != n - 2) {
        ++boss;
    }

    while (me == boss || adj[boss][me]) {
        ++me;
    }

    for (int i = 0; i < n; ++i) {
        if (i == me) {
            tp[i] = 2;
        }
        else if (i == boss) {
            tp[i] = 3;
        }
        else {
            if (adj[i][me]) {
                tp[i] = 0;
            }
            else {
                tp[i] = 1;
            }
        }
    }

    pii meshok = mp(INF, -1);

    for (int i = 0; i < n; ++i) {
        if (tp[i] == 0) {
            int cnt = 0;

            for (int j = 0; j < n; ++j) {
                if (tp[j] == 0 && adj[i][j]) {
                    ++cnt;
                }
            }

            if (cnt < meshok.fi) {
                meshok = mp(cnt, i);
            }
            else if (cnt == meshok.fi && deg[meshok.se] < deg[i]) {
                meshok.se = i;
            } 
        }
    }

    for (int i = 0; i < n; ++i) {
        if (tp[i] == 0) {
            dep[i] = INF;
        }
    }

    queue<int> q;
    q.push(meshok.se);
    dep[meshok.se] = 0;

    while (!q.empty()) {
        int v = q.front();
        q.pop();

        for (int to = 0; to < n; ++to) {
            if (tp[to] == 0 && adj[v][to] && dep[to] > dep[v] + 1) {
                dep[to] = dep[v] + 1;
                q.push(to);
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        if (tp[i] == 0) {
            for (int j = 0; j < n; ++j) {
                if (tp[j] == 1 && adj[i][j]) {
                    id[j] += (1 << dep[i]);
                }
            }
        }
    }

    for (int i = 0; i < n; ++i) {
        if (tp[i] == 1) {
            for (int j = i + 1; j < n; ++j) {
                if (tp[j] == 1) {
                    if (adj[i][j]) {
                        _e.pb(mp(id[i], id[j]));
                    }
                }
            }
        }
    }

    InitMap(n - 12, _e.size());

    for (int i = 0; i < _e.size(); ++i) {
        MakeMap(_e[i].fi, _e[i].se);
    }
}

void Bob(int _n, int _m, int A[], int B[]) {
    n = _n;
    m = _m;

    for (int i = 0; i < m; ++i) {
        e[i] = mp(A[i], B[i]);
    }    

    solve();
}

Compilation message (stderr)

Alice.cpp: In function 'void buildGood()':
Alice.cpp:62:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < _e.size(); ++i) {
                     ~~^~~~~~~~~~~

Bob.cpp: In function 'void solve()':
Bob.cpp:146:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < _e.size(); ++i) {
                     ~~^~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...