답안 #130139

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
130139 2019-07-14T05:16:01 Z BThero 항공 노선도 (JOI18_airline) C++17
0 / 100
2500 ms 194104 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>;

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, 2 * n));
    }

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

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

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

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

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

    InitG(n + k + 2, _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>;

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

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) {
                        if (adj[i][j]) {
                            _e.pb(mp(id[i], id[j]));
                        }
                    }
                }
            }
        }
    }
    else {
        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] = -1;
            }
        }

        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:98: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:182:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < _e.size(); ++i) {
                     ~~^~~~~~~~~~~
Bob.cpp:180:12: warning: '_n' may be used uninitialized in this function [-Wmaybe-uninitialized]
     InitMap(_n, _e.size());
     ~~~~~~~^~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3078 ms 194104 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Execution timed out 3078 ms 194104 KB Time limit exceeded
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 979 ms 38496 KB Execution killed with signal 11 (could be triggered by violating memory limits)
2 Halted 0 ms 0 KB -