답안 #612676

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
612676 2022-07-29T20:17:23 Z AugustinasJucas 자매 도시 (APIO20_swap) C++14
13 / 100
422 ms 45676 KB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;

vector<pair<int, pair<int, int> > > brn;
const int dydis = 1e5 + 10;
int tevas[dydis];
int kadaNelinija[dydis];
bool neraLinija[dydis] = {};
vector<int> nodes[dydis];
int A[dydis], B[dydis];
int n, m;
vector<pair<int, int> > gr[dydis];
void add(int a, int b, int w) {
    //cout << "brn " << a << " -- " << b << ", w = " << w << endl;
    gr[a].push_back({b, w});
    gr[b].push_back({a, w});
}
int fp(int v) {
    if(tevas[v] == v) return v;
    return tevas[v] = fp(tevas[v]);
}
void conn(int a, int b, int t) {
    int inA = a; int inB = b;

    a = fp(a);
    b = fp(b);
 //   //cout << "jungiu " << inA << "(yra_linija = " << !neraLinija[a] <<") su " << inB  << "(yra_linija = " << !neraLinija[b] << ")" << endl;
    if(a == b) {
        if(neraLinija[a]) return ;
        neraLinija[a] = true;
        for(auto x : nodes[a]) kadaNelinija[x] = t;
    }else {
        add(inA, inB, t);
        if(neraLinija[a] || neraLinija[b]) {
            if(!neraLinija[a]) for(auto x : nodes[a]) kadaNelinija[x] = t;
            if(!neraLinija[b]) for(auto x : nodes[b]) kadaNelinija[x] = t;
            neraLinija[a] = neraLinija[b] = true;
        }
        if(nodes[a].size() > nodes[b].size()) swap(a, b);
        // a ---> b

        if(!neraLinija[a] && !neraLinija[b]) {
            set<int> galai = {A[a], B[a], A[b], B[b]};
            ////cout << "linju galai: "; for(auto x : galai) //cout << x << " ";
          //  //cout << ", o as jungiu " << inA << " su " << inB << endl;
            if(galai.count(inA) && galai.count(inB)) {
                /// sujungiau liniju galus
                int na, nb;
                if(A[a] == inA || A[a] == inB) {
                    na = B[a];
                }else {
                    na = A[a];
                }
                if(A[b] == inA || A[b] == inB) {
                    nb = B[b];
                }else {
                    nb = A[b];
                }
                A[b] = na;
                B[b] = nb;
            }else {
                for(auto x : nodes[a]) kadaNelinija[x] = t;
                for(auto x : nodes[b]) kadaNelinija[x] = t;
                neraLinija[b] = true;
            }
        }

        tevas[a] = b;
        for(auto x : nodes[a]) nodes[b].push_back(x);

    }
}
int dbInd = 0;
int enter[dydis], leave[dydis];
int rotW[dydis], par[dydis];
int h[dydis];
void dfs(int v, int came) {
    enter[v] = dbInd++;
    par[v] = came;
   // //cout << "esi " << v << endl;
    for(auto x : gr[v]) {
        if(x.first == came) continue;
        h[x.first] = h[v] + 1;
        rotW[x.first] = x.second;
        //cout << "rot[" << x.first << "] = " << x.second <<  ", T./Y., " << rotW[x.first] << endl;

        dfs(x.first, v);
    }
    leave[v] = dbInd++;
}
const int dd = 20;
int lft[dydis][dd];
int mx[dydis][dd];
void calc() {
    for(int i = 0; i < n; i++) {
        lft[i][0] = par[i];
        //cout << "rotw[" << i << "] = " << rotW[i] << endl;
        mx[i][0] = rotW[i];
        //cout << "mx[" << i << "][" << 0 << "] = " << mx[i][0] << endl;
    }
    for(int j = 1; j < dd; j++) {
        for(int i = 0; i < n; i++) {
            lft[i][j] = lft[lft[i][j-1]][j-1];
        }
    }
    for(int j = 1; j < dd; j++) {
        for(int i = 0; i < n; i++) {
            mx[i][j] = max(mx[i][j-1], mx[ lft[i][j-1] ][j-1]);
            //cout << "mx[" << i << "][" << j << "] = " << mx[i][j] << endl;
        }
    }

}
bool isAnc(int a, int b) {
    return (enter[a] <= enter[b] && leave[b] <= leave[a]);
}

int lca(int a, int b) {
    if(isAnc(a, b)) return a;
    if(isAnc(b, a)) return b;
    for(int i = dd-1; i > -1; i--) {
        if(!isAnc(lft[a][i], b)) {
            a = lft[a][i];
        }
    }
    return par[a];
}

int mxPerBrn(int a, int kek) {
    int ret = 0;
    for(int i = dd-1; i > -1; i--) {
        if((1 << i) <= kek) {
            ret = max(ret, mx[a][i]);
            a = lft[a][i];
            kek -= (1 << i);
        }
    }
    return ret;
}
int mxInPath(int a, int b) {
    int v = lca(a, b);
    int kair = mxPerBrn(a, h[a] - h[v]);
    int desn = mxPerBrn(b, h[b] - h[v]);
    return max(kair, desn);
}

void init(int N, int M,
          std::vector<int> U, std::vector<int> V, std::vector<int> W) {
    n = N; m = M;
    for(int i = 0; i < n; i++)  {
        tevas[i] = i;
        nodes[i] = {i};
        A[i] = i; B[i] = i;
        neraLinija[i] = false;
        kadaNelinija[i] = -1;
    }

    for(int i = 0; i < m; i++) {
        brn.push_back({W[i], {U[i], V[i]}});
    }
    sort(brn.begin(), brn.end()); /// nuo maz iki did.

    for(auto x : brn) {
        int a = x.second.first;
        int b = x.second.second;
        int w = x.first;
        conn(a, b, w);
    }
    h[0] = 0;
    dfs(0, 0);
    calc();

    for(int i = 0; i < n; i++) {
        //cout << "virsune nr " << i << " tampa nebe linija, kai w = " << kadaNelinija[i] << endl;
    }

    /*for(int i = 0; i < n; i++) {
        for(int j = i+1; j < n; j++) {
            int res = mxInPath(i, j);
            cout << "min max val tarp " << i << " ir " << j << " yra " << res << endl;
        }
        cout << endl;
    }*/


}

int getMinimumFuelCapacity(int X, int Y) {
    if(kadaNelinija[fp(X)] == -1 || kadaNelinija[fp(Y)] == -1) return -1;
    int ret = mxInPath(X, Y);
    ret = max(ret, max(kadaNelinija[fp(X)], kadaNelinija[fp(Y)]));
    return ret;
}
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 3 ms 5204 KB Output is correct
5 Correct 3 ms 5332 KB Output is correct
6 Correct 4 ms 5332 KB Output is correct
7 Correct 3 ms 5332 KB Output is correct
8 Correct 3 ms 5332 KB Output is correct
9 Correct 134 ms 33956 KB Output is correct
10 Correct 177 ms 40900 KB Output is correct
11 Correct 204 ms 40004 KB Output is correct
12 Correct 190 ms 42288 KB Output is correct
13 Correct 157 ms 41072 KB Output is correct
14 Correct 148 ms 33376 KB Output is correct
15 Correct 226 ms 43092 KB Output is correct
16 Correct 239 ms 40604 KB Output is correct
17 Correct 229 ms 45676 KB Output is correct
18 Correct 211 ms 41624 KB Output is correct
19 Correct 92 ms 14444 KB Output is correct
20 Correct 385 ms 43660 KB Output is correct
21 Correct 391 ms 41776 KB Output is correct
22 Correct 422 ms 45320 KB Output is correct
23 Correct 338 ms 42692 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 239 ms 36572 KB Output is correct
4 Correct 247 ms 37940 KB Output is correct
5 Correct 258 ms 37360 KB Output is correct
6 Correct 216 ms 37784 KB Output is correct
7 Correct 232 ms 37624 KB Output is correct
8 Correct 254 ms 36476 KB Output is correct
9 Correct 227 ms 37364 KB Output is correct
10 Correct 277 ms 36108 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 3 ms 5204 KB Output is correct
5 Correct 3 ms 5332 KB Output is correct
6 Correct 4 ms 5332 KB Output is correct
7 Correct 3 ms 5332 KB Output is correct
8 Correct 3 ms 5332 KB Output is correct
9 Correct 3 ms 4948 KB Output is correct
10 Correct 4 ms 5332 KB Output is correct
11 Correct 4 ms 5332 KB Output is correct
12 Correct 3 ms 5332 KB Output is correct
13 Correct 3 ms 5204 KB Output is correct
14 Correct 4 ms 5204 KB Output is correct
15 Incorrect 3 ms 5332 KB Output isn't correct
16 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 5204 KB Output is correct
6 Correct 3 ms 5332 KB Output is correct
7 Correct 4 ms 5332 KB Output is correct
8 Correct 3 ms 5332 KB Output is correct
9 Correct 3 ms 5332 KB Output is correct
10 Correct 134 ms 33956 KB Output is correct
11 Correct 177 ms 40900 KB Output is correct
12 Correct 204 ms 40004 KB Output is correct
13 Correct 190 ms 42288 KB Output is correct
14 Correct 157 ms 41072 KB Output is correct
15 Correct 4 ms 5332 KB Output is correct
16 Correct 4 ms 5332 KB Output is correct
17 Correct 3 ms 5332 KB Output is correct
18 Correct 3 ms 5204 KB Output is correct
19 Correct 4 ms 5204 KB Output is correct
20 Incorrect 3 ms 5332 KB Output isn't correct
21 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 2 ms 4948 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 3 ms 5204 KB Output is correct
5 Correct 3 ms 5332 KB Output is correct
6 Correct 4 ms 5332 KB Output is correct
7 Correct 3 ms 5332 KB Output is correct
8 Correct 3 ms 5332 KB Output is correct
9 Correct 134 ms 33956 KB Output is correct
10 Correct 177 ms 40900 KB Output is correct
11 Correct 204 ms 40004 KB Output is correct
12 Correct 190 ms 42288 KB Output is correct
13 Correct 157 ms 41072 KB Output is correct
14 Correct 148 ms 33376 KB Output is correct
15 Correct 226 ms 43092 KB Output is correct
16 Correct 239 ms 40604 KB Output is correct
17 Correct 229 ms 45676 KB Output is correct
18 Correct 211 ms 41624 KB Output is correct
19 Correct 239 ms 36572 KB Output is correct
20 Correct 247 ms 37940 KB Output is correct
21 Correct 258 ms 37360 KB Output is correct
22 Correct 216 ms 37784 KB Output is correct
23 Correct 232 ms 37624 KB Output is correct
24 Correct 254 ms 36476 KB Output is correct
25 Correct 227 ms 37364 KB Output is correct
26 Correct 277 ms 36108 KB Output is correct
27 Correct 4 ms 5332 KB Output is correct
28 Correct 4 ms 5332 KB Output is correct
29 Correct 3 ms 5332 KB Output is correct
30 Correct 3 ms 5204 KB Output is correct
31 Correct 4 ms 5204 KB Output is correct
32 Incorrect 3 ms 5332 KB Output isn't correct
33 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 3 ms 4948 KB Output is correct
2 Correct 3 ms 4948 KB Output is correct
3 Correct 2 ms 4948 KB Output is correct
4 Correct 2 ms 4948 KB Output is correct
5 Correct 3 ms 5204 KB Output is correct
6 Correct 3 ms 5332 KB Output is correct
7 Correct 4 ms 5332 KB Output is correct
8 Correct 3 ms 5332 KB Output is correct
9 Correct 3 ms 5332 KB Output is correct
10 Correct 134 ms 33956 KB Output is correct
11 Correct 177 ms 40900 KB Output is correct
12 Correct 204 ms 40004 KB Output is correct
13 Correct 190 ms 42288 KB Output is correct
14 Correct 157 ms 41072 KB Output is correct
15 Correct 148 ms 33376 KB Output is correct
16 Correct 226 ms 43092 KB Output is correct
17 Correct 239 ms 40604 KB Output is correct
18 Correct 229 ms 45676 KB Output is correct
19 Correct 211 ms 41624 KB Output is correct
20 Correct 239 ms 36572 KB Output is correct
21 Correct 247 ms 37940 KB Output is correct
22 Correct 258 ms 37360 KB Output is correct
23 Correct 216 ms 37784 KB Output is correct
24 Correct 232 ms 37624 KB Output is correct
25 Correct 254 ms 36476 KB Output is correct
26 Correct 227 ms 37364 KB Output is correct
27 Correct 277 ms 36108 KB Output is correct
28 Correct 4 ms 5332 KB Output is correct
29 Correct 4 ms 5332 KB Output is correct
30 Correct 3 ms 5332 KB Output is correct
31 Correct 3 ms 5204 KB Output is correct
32 Correct 4 ms 5204 KB Output is correct
33 Incorrect 3 ms 5332 KB Output isn't correct
34 Halted 0 ms 0 KB -