Submission #764628

# Submission time Handle Problem Language Result Execution time Memory
764628 2023-06-23T16:48:26 Z raysh07 Swapping Cities (APIO20_swap) C++17
0 / 100
2 ms 4948 KB
#include "swap.h"
#include <bits/stdc++.h>
using namespace std;

struct edge{
    int u, v, w;
};

bool comp(edge x, edge y){
    return x.w < y.w;
}
 
int n, m;
const int maxn = 1e5 + 69;
vector <pair<int, int>> adj[maxn], g[maxn];
int root[maxn], mn[maxn], r2[maxn];
set <pair<int, pair<int, int>>> path, ans;
edge e[2 * maxn];
int mp[maxn];
multiset <int> ok;
int l2;

void dfs2(int u, int need, int par){
    if (u == need){
        l2 = *(--ok.end());
    }
    
    for (auto [v, w] : adj[u]){
        if (v == par) continue;
        ok.insert(w);
        dfs2(v, need, u);
        ok.erase(ok.find(w));
    }
}

int find2(int x){
    if (x == r2[x]) return x;
    return r2[x] = find2(r2[x]);
}

bool unite2(int x, int y){
    x = find2(x); y = find2(y);
    if (x == y) return false;
    
    r2[y] = x;
    return true;
}

int find(int x) {
    if (x == root[x]) return x;
    return root[x] = find(root[x]);
}

bool unite(int x, int y){
    x = find(x); y = find(y);
    if (x == y) return false;
    
    root[y] = x;
    return true;
}

pair<int, pair<int, int>> get(int u, int v, int w){
    return {w, {u, v}};
}

void dfs(int u, int need, int par){
    if (need == u) ans = path;
    
    for (auto [v, w] : adj[u]){
        if (v == par) continue;
        path.insert(get(u, v, w));
        path.insert(get(v, u, w));
        dfs(v, need, u);
        path.erase(get(u, v, w));
        path.erase(get(v, u, w));
    }
}
 
void init(int N, int M, vector<int> U, vector<int> V, vector<int> W) {
    n = N;
    m = M;
    vector <pair<int, pair<int, int>>> vec;
    for (int i = 0; i < m; i++){
        vec.push_back({W[i], {U[i], V[i]}});
    }
    sort(vec.begin(), vec.end());
    
    for (int i = 0; i < m; i++){
        e[i].u = vec[i].second.first; 
        e[i].v = vec[i].second.second; 
        e[i].w = vec[i].first;
    }
    
    for (int i = 0; i < n; i++){
        root[i] = r2[i] = i;
        mn[i] = 1e9 + 1;
    }
    
    for (int i = 0; i < m; i++){
        auto x = e[i];
      //  cout << x.u << " " << x.v << "BRUH\n";
        if (unite(x.u, x.v)){
            adj[x.u].push_back({x.v, x.w});
            adj[x.v].push_back({x.u, x.w});
           // cout << "ADDED " << x.u << " " << x.v << " " << x.w << "\n";
        } else {
            mn[x.u] = min(mn[x.u], x.w);
            mn[x.v] = min(mn[x.v], x.w);
            if (unite(x.u, x.v)){
                g[x.u].push_back({x.v, x.w});
                g[x.v].push_back({x.u, x.w});
            }
        }
    }
}
 
int getMinimumFuelCapacity(int x, int y) {
    dfs(x, y, -1);
    l2 = 1e9 + 1;
    dfs2(x, y, -1);
    for (int i = 0; i < n; i++) mp[i] = 0;
    int lol = 0;
    for (auto x : ans) {
        lol = max(lol, x.first);
        mp[x.second.first]++;
        mp[x.second.second]++;
    }
    int l1 = l2;
    
    // cout << ans.size() << "\n";
    // for (auto x : ans) {
    //     cout << x.first << " " << x.second.first << " " << x.second.second << "\n";
    // }
    
    for (int i = 0; i < m; i++){
        if (ans.find(get(e[i].u, e[i].v, e[i].w)) == ans.end()){
            if (mp[e[i].u] && mp[e[i].v]) l1 = min(l1, e[i].w);
            else if (e[i].u == x || e[i].u == y || e[i].v == x || e[i].v == y);
            else if (mp[e[i].u] || mp[e[i].v]) l1 = min(l1, e[i].w);
        }
    }
    
    if (l1 > 1e9) return -1;
    else return max(l1, lol);
}

// int main(){
//     int n, m; cin >> n >> m;
//     vector <int> u(m), v(m), w(m);
//     for (auto &x : u) cin >> x;
//     for (auto &x : v) cin >> x;
//     for (auto &x : w) cin >> x;
//     init(n, m, u, v, w);
//     int q; cin >> q;
//     while (q--){
//         int x, y; cin >> x >> y;
//         cout << getMinimumFuelCapacity(x, y) << "\n";
//     }
//     return 0;
// }
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 4948 KB Output isn't correct
2 Halted 0 ms 0 KB -