답안 #569863

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
569863 2022-05-28T01:53:51 Z ryangohca 자매 도시 (APIO20_swap) C++17
7 / 100
459 ms 32336 KB
#include "swap.h"

#include <bits/stdc++.h>
using namespace std;
int p[100001], pweight[100001][20], st[100001], en[100001], lineWeight[100001], twok[100001][20];
vector<int> linNodes[100001];
void init(int N){
    iota(p, p+N, 0);
    iota(st, st+N, 0);
    iota(en, en+N, 0);
    fill(lineWeight, lineWeight+N, 2e9);
    for (int i = 0; i < N; i++) linNodes[i].push_back(i);
    memset(twok, -1, sizeof twok);
    memset(pweight, -1, sizeof pweight);
}
int fs(int x){
    if (p[x] == x) return x;
    return p[x] = fs(p[x]);
}
void ms(int x, int y, int w){
    int px = fs(x), py = fs(y);
    if (px == py && lineWeight[px] == 2e9){
        st[px] = en[px] = -1;
        for (auto i : linNodes[px]){
            lineWeight[i] = min(lineWeight[i], w);
        }
        return;
    }
    if (linNodes[px].size() < linNodes[py].size()) swap(px, py);
    p[py] = px; // px -> py
    //cout << px << ' ' << py << ' ' << w << endl;
    twok[py][0] = px;
    pweight[py][0] = w;
    if (st[px] != -1 && st[py] != -1){
        if ((st[px] == x || en[px] == x) && (st[py] == y || en[py] == y)){
            st[px] = (st[px] == x ? en[px] : st[px]);
            en[px] = (st[py] == y ? en[py] : st[py]);
            for (auto i : linNodes[py]){
                linNodes[px].push_back(i);
            }
        } else {
            st[px] = en[px] = -1;
            for (auto i : linNodes[px]){
                lineWeight[i] = min(lineWeight[px], w);
            }
            for (auto i : linNodes[py]){
                lineWeight[i] = min(lineWeight[py], w);
            }
        }
    } else if (st[px] != -1){
        st[px] = en[px] = -1;
      	for (auto i : linNodes[px]){
      	    lineWeight[i] = w;
      	}
    } else if (st[py] != -1){
        for (auto i : linNodes[py]){
            lineWeight[i] = w;
        }
    } else {
        lineWeight[px] = min(lineWeight[px], lineWeight[py]);
    }
}
void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    init(N);
    vector<tuple<int, int, int>> edges;
    for (int i = 0; i < M; i++){
        edges.push_back({W[i], U[i], V[i]});
    }
    sort(edges.begin(), edges.end());
    for (auto [w, a, b] : edges){
        ms(a, b, w);
    }
    for (int i = 1; i <= 19; i++){
        for (int j = 0; j < N; j++){
            if (twok[j][i-1] != -1){
                twok[j][i] = twok[twok[j][i-1]][i-1];
                pweight[j][i] = max(pweight[j][i-1], pweight[twok[j][i-1]][i-1]);
            }
        }
    }
}
bool isOkay(int mid, int X, int Y){
    for (int i = 19; i >= 0; i--){
        if (twok[X][i] != -1 && pweight[X][i] <= mid) X = twok[X][i];
        if (twok[Y][i] != -1 && pweight[Y][i] <= mid) Y = twok[Y][i];
    }
    if (X != Y) return false;
    return lineWeight[X] != -1 && lineWeight[X] <= mid;
}
int getMinimumFuelCapacity(int X, int Y) {
    int mini = 0, maxi = 1e9+10;
    while (maxi - mini > 1){
        int mid = (maxi + mini) / 2;
        if (isOkay(mid, X, Y)) maxi = mid;
        else mini = mid;
    }
    return (maxi==1e9+10?-1:maxi);
}
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 7 ms 18272 KB Output is correct
4 Incorrect 9 ms 18300 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 439 ms 31920 KB Output is correct
4 Correct 424 ms 32256 KB Output is correct
5 Correct 447 ms 32240 KB Output is correct
6 Correct 416 ms 32216 KB Output is correct
7 Correct 444 ms 32336 KB Output is correct
8 Correct 433 ms 31872 KB Output is correct
9 Correct 429 ms 32200 KB Output is correct
10 Correct 459 ms 31880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 7 ms 18272 KB Output is correct
4 Incorrect 9 ms 18300 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 7 ms 18272 KB Output is correct
4 Incorrect 9 ms 18300 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 7 ms 18272 KB Output is correct
4 Incorrect 9 ms 18300 KB Output isn't correct
5 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 8 ms 18260 KB Output is correct
2 Correct 8 ms 18260 KB Output is correct
3 Correct 7 ms 18272 KB Output is correct
4 Incorrect 9 ms 18300 KB Output isn't correct
5 Halted 0 ms 0 KB -