Submission #570639

#TimeUsernameProblemLanguageResultExecution timeMemory
570639dooweyKeys (IOI21_keys)C++17
0 / 100
12 ms21460 KiB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef pair<int, int> pii;

#define fi first
#define se second
#define mp make_pair


const int N = (int)3e5 + 1;

int par[N];
vector<pii> T[N];
int col[N];
vector<int> vv[N];

int fin(int x){
    if(par[x] == x) return x;
    return par[x]=fin(par[x]);
}

void merge(int u, int v){
    u=fin(u);
    v=fin(v);
    if(u == v) return;
    par[u] = v;
}

bool vis[N];
bool has_key[N];
vector<int> nex[N];

vector<pii> unite;
vector<int> cols;
vector<int> nodes;

void clean(int a, int b){
    unite.push_back(mp(a, b));
    for(auto p : cols){
        has_key[p] = false;
        nex[p].clear();
    }
    cols.clear();
    nodes.clear();
}



void travel(int node){
    if(vis[node]) return;
    queue<int> lis;
    vis[node] = true;
    int init = node;
    while(!lis.empty()){

        node = lis.front();
        nodes.push_back(node);
        lis.pop();
        if(!has_key[col[node]]){
            cols.push_back(col[node]);
        }
        has_key[col[node]] = true;
        for(auto p : nex[col[node]]){
            if(vis[p]) continue;
            if(fin(p) != fin(node)){
                clean(node, p);
                return;
            }
        }
        nex[col[node]].clear();
        for(auto x : T[node]){
            if(vis[x.fi]) continue;
            if(has_key[x.se]){
                if(fin(x.fi) != fin(node)){
                    clean(node, x.fi);
                    return;
                }
                vis[x.fi]=true;
                lis.push(x.fi);
            }
            else{
                cols.push_back(x.se);
                nex[x.se].push_back(x.fi);
            }
        }
    }
    init=fin(init);
    vv[init]=nodes;

    for(auto p : cols){
        has_key[p] = false;
        nex[p].clear();
    }
    cols.clear();
    nodes.clear();
}



vector<int> find_reachable(vector<int> r, vector<int> u, vector<int> v, vector<int> c) {
    int m = u.size();
    int n = r.size();
    for(int i = 0 ; i < n; i ++ ){
        par[i] = i;
        col[i] = r[i];
    }
    for(int i = 0 ; i < m ; i ++ ){
        T[u[i]].push_back(mp(v[i], c[i]));
        T[v[i]].push_back(mp(u[i], c[i]));
    }
    bool changes = true;
    while(changes){
        changes = false;
        for(int i = 0 ; i < n; i ++ ){
            if(vis[i]) continue;
            if(par[i] == i){
                travel(i);
            }
        }
        for(auto x : unite){
            if(fin(x.fi) != fin(x.se)){
                merge(x.fi, x.se);
                changes = true;
            }
        }
        unite.clear();
        for(int i = 0 ; i < n; i ++ ){
            vis[i]=false;
        }
    }
    vector<int> ans(n);
    int reach = n + 1;
    vector<int> smol;
    int go;
    for(int i = 0 ; i < n; i ++ ){
        if(par[i] == i){
            travel(i);
            go = fin(i);
            if(vv[go].size() < reach){
                reach = vv[go].size();
                smol = vv[go];
            }
            else if(vv[go].size() == reach){
                for(auto x : vv[go]){
                    smol.push_back(x);
                }
            }
        }
    }
    for(auto x : smol){
        ans[x] = 1;
    }
    return ans;
}

Compilation message (stderr)

keys.cpp: In function 'std::vector<int> find_reachable(std::vector<int>, std::vector<int>, std::vector<int>, std::vector<int>)':
keys.cpp:142:30: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  142 |             if(vv[go].size() < reach){
      |                ~~~~~~~~~~~~~~^~~~~~~
keys.cpp:146:35: warning: comparison of integer expressions of different signedness: 'std::vector<int>::size_type' {aka 'long unsigned int'} and 'int' [-Wsign-compare]
  146 |             else if(vv[go].size() == reach){
      |                     ~~~~~~~~~~~~~~^~~~~~~~
#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...