제출 #591981

#제출 시각아이디문제언어결과실행 시간메모리
591981SlavicG열쇠 (IOI21_keys)C++17
37 / 100
772 ms16740 KiB
#include "bits/stdc++.h"
using namespace std;

using ll = long long;

#define forn(i, n) for(int i = 0; i < n; ++i)
#define sz(a) (int)a.size()
#define pb push_back
#define all(a) a.begin(), a.end()

const int N = 2005;
vector<pair<int, int>> adj[N];
int cnt[N], s;
bool vis[N];
set<int> require[N];
set<int> have[N];
set<int> already;
void dfs(int u, vector<int>& r) {
    assert(vis[u] == false);
    vis[u] = true;
    ++cnt[s];
    already.insert(r[u]);
    for(auto x: adj[u]) {
        int v = x.first, c = x.second;
        if(!vis[v]) {
            if(already.count(c)) {
                dfs(v, r);
            } else {
                require[c].insert(v);
                have[v].insert(c);
            }
        }
    }
    //for(auto x: have[u]) require[x].erase(u);
    for(auto x: require[r[u]]) {
        if(!vis[x]) {
            dfs(x, r);
        }
    }
}

void solve(int start, vector<int>& r) {
    already.clear();
    s = start;
    forn(i, N) require[i].clear();
    forn(i, N) have[i].clear();
    forn(i, N) vis[i] = false;
    dfs(start, r);
}
vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) {
    for(int i = 0; i < sz(u); ++i) {
        adj[u[i]].pb({v[i], c[i]});
        adj[v[i]].pb({u[i], c[i]});
    }
    int n = sz(r);
	vector<int> ans(n, 1);
    for(int i = 0; i < n; ++i) solve(i, r);
    forn(i, n) ans[i] = cnt[i];
    int x = *min_element(all(ans));
    for(int& i: ans) i = (i == x ? 1 : 0);
	return ans;
}
#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...