제출 #893233

#제출 시각아이디문제언어결과실행 시간메모리
893233vjudge1Simurgh (IOI17_simurgh)C++17
0 / 100
1 ms596 KiB
#include "simurgh.h"
#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;

struct UF {
    vi e;
    UF(int N) : e(N, -1) {}
    int repr(int u) {
        while(e[u] >= 0) u = e[u];
        return u;
    }
    int join(int u, int v) {
        u = repr(u); v = repr(v);
        if(u == v) return 0;
        if(e[u] > e[v]) swap(u, v);
        e[u] += e[v];
        e[v] = u;
        return 1;
    }
    bool same(int u, int v) { return repr(u) == repr(v); }
    void clear() { for(auto &it : e) it = -1; }
};

vi find_roads(int n, vi u, vi v) {
    int m = u.size();
    UF sol(n);
    vector<vi> L(n);
    for(int i = 0; i < m; ++i) {
        L[u[i]].push_back(v[i]);
        L[v[i]].push_back(u[i]);
    }
    vi Re;
    for(int i = 0; i < n; ++i) {
        sol.clear();
        vector<int> Q;
        for(int j = 0; j < m; ++j) {
            if(u[j] != i && v[j] != i) {
                if(sol.join(u[j], v[j])) {
                    Q.push_back(j);
                }
            }
        }
     //   vector<int> Cul;
     //   for(int j = 0; j < m; ++j) {
     //       if(u[j] == i || v[j] == i) {
     //           int x = u[j];
     //           if(x == i) x = v[j];
     //           Cul.push_back(sol.repr(x));
     //       }
     //   }
     //   sort(Cul.begin(), Cul.end());
     //   Cul.resize(unique(Cul.begin(), Cul.end()) - Cul.begin());
     //   auto id = [&](int v) {
     //       return lower_bound(Cul.begin(), Cul.end(), v) - Cul.begin();
     //   };
        map<int, vector<int> > M;
        for(int j = 0; j < m; ++j) {
            if(u[j] == i || v[j] == i) {
                int x = u[j];
                if(x == i) x = v[j];
                M[sol.repr(x)].push_back(j);
            }
        }
        for(auto [cul, vec] : M) {
            vi QQ = Q;
            for(auto [altcul, altvec] : M)
                if(altcul != cul)
                    QQ.push_back(altvec[0]);
            int rem = 0, muchie = 0;
            for(auto it : vec) {
                QQ.push_back(it);
                int v = count_common_roads(QQ);
                QQ.pop_back();
                if(v > rem) {
                    rem = v;
                    muchie = it;
                }
            }
            Re.push_back(muchie);
        }
    }
    sort(Re.begin(), Re.end());
    Re.resize(unique(Re.begin(), Re.end()) - Re.begin());
    return Re;
}
#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...