답안 #319845

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
319845 2020-11-06T14:35:47 Z arujbansal 자매 도시 (APIO20_swap) C++17
7 / 100
389 ms 25292 KB
#include "swap.h"
#include <bits/stdc++.h>

#define FAST_IO ios_base::sync_with_stdio(false), cin.tie(nullptr), cout.tie(nullptr)
#define setIO(i, o) freopen(i, "r", stdin), freopen(o, "w", stdout)
#define pb push_back
#define eb emplace_back
#define all(x) (x).begin(), (x).end()
#define rall(x) (x).rbegin(), (x).rend()
#define sz(x) (int) (x).size()
#define lc(i) 2*i
#define rc(i) 2*i+1
//#define int long long
using namespace std;
using ll = long long;
using ii = pair<int, int>;
using vii = vector<ii>;
using vi = vector<int>;
using vvi = vector<vi>;
using vb = vector<bool>;
using vvb = vector<vb>;

const int MAXN = 1e5 + 20, MOD = 1e9 + 7, INF = 1e9;

struct Edge {
    int u, v, w;

    bool operator<(const Edge &other) {
        return w < other.w;
    }
};

struct DSU {
    int n;
    vi par, s, deg, mxDeg, timeValid;
    vii root[MAXN];
    vi g[MAXN];

    void init(int n) {
        this->n = n;
        par.resize(n);
        iota(all(par), 0);
        s.assign(n, 1);
        deg.assign(n, 0);
        mxDeg.assign(n, 0);
        timeValid.assign(n, INF);

        for (int i = 0; i < n; i++)
            root[i].eb(0, i);
    }

    int get(int x) {
        return par[x];
    }
    
    void mark(int x, int newPar) {
        if (par[x] == newPar) return;
        
        par[x] = newPar;
        
        for (const auto &v : g[x]) mark(v, newPar);
    }

    void unite(int u, int v, int time) {
        deg[u]++;
        deg[v]++;

        int x = get(u);
        int y = get(v);

        if (deg[u] >= 3) timeValid[x] = min(timeValid[x], time);
        if (deg[v] >= 3) timeValid[y] = min(timeValid[y], time);

        if (x == y) {
            timeValid[x] = min(timeValid[x], time);
            return;
        }
        
        g[u].pb(v);
        g[v].pb(u);

        if (s[x] > s[y]) {
            swap(x, y);
            swap(u, v);
        }

        mark(par[x], y);
        s[y] += s[x];
        timeValid[y] = min(timeValid[y], timeValid[x]);

        root[u].eb(time, y);
    }

    bool query(int u, int v, int time) {
        time++;

        auto x = upper_bound(all(root[u]), ii(time, INF));
        auto y = upper_bound(all(root[v]), ii(time, INF));
        x--, y--;

        ii rootU = *x;
        ii rootV = *y;

        if (rootU.second == rootV.second)
            return timeValid[rootU.second] <= time;

        return false;
    }
};

DSU graph;
vector<Edge> edges;
int n, m;

void init(int N, int M, vi U, vi V, vi W) {
    n = N;
    m = M;

    edges.resize(M);

    for (int i = 0; i < M; i++) {
        edges[i].u = U[i];
        edges[i].v = V[i];
        edges[i].w = W[i];
    }

    sort(all(edges));

    graph.init(N);

    for (int i = 0; i < M; i++)
        graph.unite(edges[i].u, edges[i].v, i + 1);
}

int getMinimumFuelCapacity(int X, int Y) {
    int lo = 0, hi = m - 1;
    int ans = INF;

    while (lo <= hi) {
        int mid = (lo + hi) >> 1;
        if (graph.query(X, Y, mid)) {
            ans = min(ans, edges[mid].w);
            hi = mid - 1;
        } else lo = mid + 1;
    }

    return ans < INF ? ans : -1;
}

//signed main() {
//    FAST_IO;
//#ifdef arujbansal_local
//    setIO("input.txt", "output.txt");
//#endif
//
//    int a, b;
//    cin >> a >> b;
//    int u[b], v[b], wt[b];
//
//    for (int i = 0; i < b; i++)
//        cin >> u[i] >> v[i] >> wt[i];
//
//    init(a, b, u, v, wt);
//
//    int q;
//    cin >> q;
//    while (q--) {
//        int x, y;
//        cin >> x >> y;
//        cout << getMinimumFuelCapacity(x, y) << "\n";
//    }
//
////    for (const auto &[time, root] : graph.root[4])
////        cout << time << " " << root << "\n";
//}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 4 ms 4972 KB Output is correct
4 Correct 4 ms 5100 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 4 ms 5100 KB Output is correct
7 Correct 5 ms 5228 KB Output is correct
8 Correct 5 ms 5100 KB Output is correct
9 Correct 178 ms 17252 KB Output is correct
10 Correct 213 ms 19684 KB Output is correct
11 Correct 214 ms 19684 KB Output is correct
12 Correct 245 ms 20708 KB Output is correct
13 Correct 127 ms 21216 KB Output is correct
14 Correct 177 ms 17372 KB Output is correct
15 Correct 376 ms 24296 KB Output is correct
16 Correct 373 ms 23796 KB Output is correct
17 Correct 389 ms 24652 KB Output is correct
18 Correct 267 ms 25292 KB Output is correct
19 Incorrect 107 ms 11492 KB Output isn't correct
20 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 259 ms 23424 KB Output is correct
4 Correct 274 ms 23908 KB Output is correct
5 Correct 284 ms 23924 KB Output is correct
6 Correct 280 ms 23748 KB Output is correct
7 Correct 273 ms 23900 KB Output is correct
8 Correct 270 ms 23308 KB Output is correct
9 Correct 270 ms 23776 KB Output is correct
10 Correct 265 ms 23320 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 4 ms 4972 KB Output is correct
4 Correct 4 ms 4972 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 4 ms 5100 KB Output is correct
7 Correct 4 ms 5100 KB Output is correct
8 Correct 5 ms 5228 KB Output is correct
9 Correct 5 ms 5100 KB Output is correct
10 Incorrect 5 ms 5100 KB Output isn't correct
11 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 4 ms 4972 KB Output is correct
4 Correct 4 ms 4972 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 4 ms 5100 KB Output is correct
7 Correct 4 ms 5100 KB Output is correct
8 Correct 5 ms 5228 KB Output is correct
9 Correct 5 ms 5100 KB Output is correct
10 Correct 178 ms 17252 KB Output is correct
11 Correct 213 ms 19684 KB Output is correct
12 Correct 214 ms 19684 KB Output is correct
13 Correct 245 ms 20708 KB Output is correct
14 Correct 127 ms 21216 KB Output is correct
15 Incorrect 5 ms 5100 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 4 ms 4972 KB Output is correct
4 Correct 4 ms 5100 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 4 ms 5100 KB Output is correct
7 Correct 5 ms 5228 KB Output is correct
8 Correct 5 ms 5100 KB Output is correct
9 Correct 178 ms 17252 KB Output is correct
10 Correct 213 ms 19684 KB Output is correct
11 Correct 214 ms 19684 KB Output is correct
12 Correct 245 ms 20708 KB Output is correct
13 Correct 127 ms 21216 KB Output is correct
14 Correct 177 ms 17372 KB Output is correct
15 Correct 376 ms 24296 KB Output is correct
16 Correct 373 ms 23796 KB Output is correct
17 Correct 389 ms 24652 KB Output is correct
18 Correct 267 ms 25292 KB Output is correct
19 Correct 259 ms 23424 KB Output is correct
20 Correct 274 ms 23908 KB Output is correct
21 Correct 284 ms 23924 KB Output is correct
22 Correct 280 ms 23748 KB Output is correct
23 Correct 273 ms 23900 KB Output is correct
24 Correct 270 ms 23308 KB Output is correct
25 Correct 270 ms 23776 KB Output is correct
26 Correct 265 ms 23320 KB Output is correct
27 Incorrect 5 ms 5100 KB Output isn't correct
28 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 4972 KB Output is correct
2 Correct 4 ms 4972 KB Output is correct
3 Correct 4 ms 4972 KB Output is correct
4 Correct 4 ms 4972 KB Output is correct
5 Correct 4 ms 5100 KB Output is correct
6 Correct 4 ms 5100 KB Output is correct
7 Correct 4 ms 5100 KB Output is correct
8 Correct 5 ms 5228 KB Output is correct
9 Correct 5 ms 5100 KB Output is correct
10 Correct 178 ms 17252 KB Output is correct
11 Correct 213 ms 19684 KB Output is correct
12 Correct 214 ms 19684 KB Output is correct
13 Correct 245 ms 20708 KB Output is correct
14 Correct 127 ms 21216 KB Output is correct
15 Correct 177 ms 17372 KB Output is correct
16 Correct 376 ms 24296 KB Output is correct
17 Correct 373 ms 23796 KB Output is correct
18 Correct 389 ms 24652 KB Output is correct
19 Correct 267 ms 25292 KB Output is correct
20 Correct 259 ms 23424 KB Output is correct
21 Correct 274 ms 23908 KB Output is correct
22 Correct 284 ms 23924 KB Output is correct
23 Correct 280 ms 23748 KB Output is correct
24 Correct 273 ms 23900 KB Output is correct
25 Correct 270 ms 23308 KB Output is correct
26 Correct 270 ms 23776 KB Output is correct
27 Correct 265 ms 23320 KB Output is correct
28 Incorrect 5 ms 5100 KB Output isn't correct
29 Halted 0 ms 0 KB -