Submission #1169567

#TimeUsernameProblemLanguageResultExecution timeMemory
1169567shiomusubi496Amusement Park (JOI17_amusement_park)C++20
10 / 100
13 ms1372 KiB
#include "Joi.h"
#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i)
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)

using namespace std;

namespace {

using ll = long long;
using PLL = pair<ll, ll>;

template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; }
template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; }

constexpr ll inf = 1e18;

class UnionFind {
    vector<int> par;

public:
    UnionFind(int n) : par(n, -1) {}
    int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); }
    bool merge(int x, int y) {
        x = find(x); y = find(y);
        if (x == y) return false;
        if (par[x] > par[y]) swap(x, y);
        par[x] += par[y];
        par[y] = x;
        return true;
    }
};

}

void Joi(int N, int M, int A[], int B[], long long X, int T) {
    vector<vector<int>> G(N);
    {
        UnionFind uf(N);
        rep (i, M) {
            if (!uf.merge(A[i], B[i])) continue;
            G[A[i]].push_back(B[i]);
            G[B[i]].push_back(A[i]);
        }
    }
    int r = 0;
    {
        vector<int> dist(N, -1);
        queue<int> que;
        dist[0] = 0;
        que.push(0);
        while (!que.empty()) {
            int v = que.front(); que.pop();
            for (auto e : G[v]) {
                if (dist[e] != -1) continue;
                dist[e] = dist[v] + 1;
                que.push(e);
            }
        }
        rep (i, N) if (dist[i] > dist[r]) r = i;
    }
    vector<int> dist(N, -1);
    {
        queue<int> que;
        dist[r] = 0;
        que.push(r);
        while (!que.empty()) {
            int v = que.front(); que.pop();
            for (auto e : G[v]) {
                if (dist[e] != -1) continue;
                dist[e] = dist[v] + 1;
                que.push(e);
            }
        }
    }
    int mx = *max_element(all(dist));
    if (mx >= 59) {
        rep (i, N) MessageBoard(i, X >> (dist[i] % 60) & 1);
    }
    else {
        assert(false);
    }
}
#include "Ioi.h"
#include <bits/stdc++.h>

#define rep(i, n) for (int i = 0; i < (int)(n); ++i)
#define rep2(i, a, b) for (int i = (int)(a); i < (int)(b); ++i)
#define rrep(i, n) for (int i = (int)(n) - 1; i >= 0; --i)
#define rrep2(i, a, b) for (int i = (int)(b) - 1; i >= (int)(a); --i)
#define all(v) begin(v), end(v)
#define rall(v) rbegin(v), rend(v)

using namespace std;

namespace {

using ll = long long;
using PLL = pair<ll, ll>;

template<class T, class U> bool chmin(T& a, const U& b) { return a > b ? a = b, true : false; }
template<class T, class U> bool chmax(T& a, const U& b) { return a < b ? a = b, true : false; }

constexpr ll inf = 1e18;

class UnionFind {
    vector<int> par;

public:
    UnionFind(int n) : par(n, -1) {}
    int find(int x) { return par[x] < 0 ? x : par[x] = find(par[x]); }
    bool merge(int x, int y) {
        x = find(x); y = find(y);
        if (x == y) return false;
        if (par[x] > par[y]) swap(x, y);
        par[x] += par[y];
        par[y] = x;
        return true;
    }
};

}

long long Ioi(int N, int M, int A[], int B[], int P, int V, int T) {
    vector<vector<int>> G(N);
    {
        UnionFind uf(N);
        rep (i, M) {
            if (!uf.merge(A[i], B[i])) continue;
            G[A[i]].push_back(B[i]);
            G[B[i]].push_back(A[i]);
        }
    }
    int r = 0;
    {
        vector<int> dist(N, -1);
        queue<int> que;
        dist[0] = 0;
        que.push(0);
        while (!que.empty()) {
            int v = que.front(); que.pop();
            for (auto e : G[v]) {
                if (dist[e] != -1) continue;
                dist[e] = dist[v] + 1;
                que.push(e);
            }
        }
        rep (i, N) if (dist[i] > dist[r]) r = i;
    }
    vector<int> dist(N, -1), par(N, -1);
    {
        queue<int> que;
        dist[r] = 0;
        que.push(r);
        while (!que.empty()) {
            int v = que.front(); que.pop();
            for (auto e : G[v]) {
                if (dist[e] != -1) continue;
                dist[e] = dist[v] + 1;
                par[e] = v;
                que.push(e);
            }
        }
    }
    int mx = *max_element(all(dist));
    if (mx >= 59) {
        ll X = (ll)V << (dist[P] % 60);
        if (dist[P] >= 59) {
            rep (_, 59) {
                X |= (ll)Move(par[P]) << (dist[par[P]] % 60);
                P = par[P];
            }
        }
        else {
            while (P != r) {
                X |= (ll)Move(par[P]) << (dist[par[P]] % 60);
                P = par[P];
            }
            vector<int> vs;
            int v = max_element(all(dist)) - dist.begin();
            while (v != r) {
                vs.push_back(v);
                v = par[v];
            }
            reverse(all(vs));
            rep (i, 59) X |= (ll)Move(vs[i]) << (dist[vs[i]] % 60);
        }
        return X;
    }
    else {
        assert(false);
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...