답안 #130158

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130158 2019-07-14T06:03:10 Z BThero 항공 노선도 (JOI18_airline) C++17
0 / 100
998 ms 38816 KB
// 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)1e3 + 5;

static pii e[MAXN * MAXN];

static int n, m;

void buildBad() {
    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 < i; ++j) {
            _e.pb(mp(i, n + j));
        }
    }

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

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

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

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

void buildGood() {
    int k = 0;

    while ((1 << k) < n) {
        ++k;
    }

    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 < k; ++j) {
            if (i & (1 << j)) {
                _e.pb(mp(i, n + j));
            }
        }
    }

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

    _e.pb(mp(n + k, n + k + 1));
    _e.pb(mp(n + k - 2, n + k));

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

    InitG(n + k + 3, _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]);
    }

    if (n <= 8) {
        buildBad();
    }
    else {
        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 int dep[MAXN];

static pii e[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, cnt = 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;
                ++cnt;
            }
            else {
                tp[i] = 1;
            }
        }
    }

    int _n;

    if (cnt * 2 + 2 == n) {
        _n = cnt;

        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];
                    }
                }
            }
        }

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

        InitMap(_n, _e.size());

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

        return;
    }

    fill(deg, deg + n, 0);

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

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

        if (tp[u] == 0 && tp[v] == 0) {
            ++deg[u];
            ++deg[v];
        }
    }

    int meshok = -1;

    for (int i = 0; i < n; ++i) {
        if (tp[i] == 0) {
            if (meshok == -1 || deg[i] < deg[meshok]) {
                meshok = i;
            }
        }
    }

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

    queue<int> q;
    q.push(meshok);
    dep[meshok] = 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, _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

Alice.cpp: In function 'void buildBad()':
Alice.cpp:56:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < _e.size(); ++i) {
                     ~~^~~~~~~~~~~
Alice.cpp: In function 'void buildGood()':
Alice.cpp:96: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:107:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < _e.size(); ++i) {
                         ~~^~~~~~~~~~~
Bob.cpp:188:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < _e.size(); ++i) {
                     ~~^~~~~~~~~~~
Bob.cpp:186:12: warning: '_n' may be used uninitialized in this function [-Wmaybe-uninitialized]
     InitMap(_n, _e.size());
     ~~~~~~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 6904 KB Wrong Answer [10]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 9 ms 6904 KB Wrong Answer [10]
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 998 ms 38816 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -