Submission #805124

#TimeUsernameProblemLanguageResultExecution timeMemory
805124eltu0815Keys (IOI21_keys)C++17
100 / 100
1165 ms62192 KiB
#include "keys.h"
#include <bits/stdc++.h>
using namespace std;

typedef pair<int, int> pii;

int n, m, cnt;
int p[300005], vis[300005], used[300005], key[300005];
int parent[300005];
vector<int> vec[300005];
vector<pii> graph[300005];

int Find(int x) {
    if(parent[x] == x) return x;
    return parent[x] = Find(parent[x]);
}

int bfs(int i) {
    queue<int> q;
    vector<int> st1, st2;
    q.push(i);
    while(!q.empty()) {
        int cur = q.front();
        q.pop();
        if(Find(i) != Find(cur)) {
            for(auto v : st1) used[key[v]] = 0;
            for(auto v : st2) vec[v].clear();
            return cur;
        }
        
        if(vis[cur]) continue;
        vis[cur] = 1;
        
        st1.push_back(cur);
        if(!used[key[cur]]) {
            used[key[cur]] = 1;
            for(auto v : vec[key[cur]]) q.push(v);
        }
        for(auto v : graph[cur]) {
            if(used[v.second]) q.push(v.first);
            else st2.push_back(v.second), vec[v.second].push_back(v.first);
        }
    }
    for(auto v : st1) p[v] = st1.size(), used[key[v]] = 0;
    for(auto v : st2) vec[v].clear();
    return -1;
}

std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) {
	n = r.size(), m = u.size();	
	for(int i = 0; i < n; ++i) key[i] = r[i], parent[i] = i, p[i] = (int)(1e9);
	for(int i = 0; i < m; ++i) {
        graph[u[i]].push_back({v[i], c[i]});
        graph[v[i]].push_back({u[i], c[i]});
	}
	
	int flag = 1;
	while(flag) {
        flag = 0; ++cnt;
        vector<pii> lst;
        for(int i = 0; i < n; ++i) vis[i] = 0;
        for(int i = 0; i < n; ++i) {
            if(Find(i) != i) continue;
            int ret = bfs(i);
            if(ret != -1) lst.push_back({ret, i}), flag = 1;
        }
        for(auto v : lst) parent[Find(v.second)] = Find(v.first);
	}
    
    vector<int> ans;
    int mn = *min_element(p, p + n);
    for(int i = 0; i < n; ++i) ans.push_back(p[i] == mn);
	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...