제출 #1166876

#제출 시각아이디문제언어결과실행 시간메모리
1166876PagodePaivaKeys (IOI21_keys)C++20
39 / 100
679 ms83308 KiB
#include<bits/stdc++.h>

using namespace std;

const int N = 300010;   
vector <int> g[N], gc[N];
int typ[N];
int mark[N];
vector <int> kosaraju;

struct DSU{
    int pai[N], sz[N];
    DSU(){
        for(int i = 0;i < N;i++){
            pai[i] = i;
            sz[i] = 1;
        }
    }
    int find(int x){
        return (pai[x] = (x == pai[x] ? x : find(pai[x])));
    }
    void join(int a, int b){
        a = find(a);
        b = find(b);
        if(a == b) return;
        if(sz[a] > sz[b]) swap(a, b);
        pai[a] = b;
        sz[b] += sz[a];
        typ[b] |= typ[a];
    }
} dsu;

void dfs2(int v, int rep){
    dsu.join(v, rep);
    mark[v] = 1;
    for(auto x : gc[v]){
        if(mark[x]) continue;
        dfs2(x, rep);
    }
    return;
}

void dfs(int v){
    mark[v] = 1;
    for(auto x : g[v]){
        if(mark[x]) continue;
        dfs(x);
    }
    kosaraju.push_back(v);
}

std::vector<int> find_reachable(std::vector<int> r, std::vector<int> u, std::vector<int> v, std::vector<int> c) {
    int n = r.size();
    for(int i = 0;i < n;i++){
        typ[i] = (1<<r[i]);
    }
    int m = u.size();
    for(int cnt = 0;cnt < 32;cnt++){
        for(int i = 0;i < n;i++){
            g[i].clear();
            mark[i] = 0;
        }
        kosaraju.clear();
        for(int i = 0;i < m;i++){
            if(dsu.find(u[i]) == dsu.find(v[i])) continue;
            if((typ[dsu.find(u[i])]&(1<<c[i]))){
                g[dsu.find(u[i])].push_back(dsu.find(v[i]));
                gc[dsu.find(v[i])].push_back(dsu.find(u[i]));
            }
            if((typ[dsu.find(v[i])]&(1<<c[i]))){
                g[dsu.find(v[i])].push_back(dsu.find(u[i]));
                gc[dsu.find(u[i])].push_back(dsu.find(v[i]));
            }
        }
        for(int i = 0;i < n;i++){
            int v = dsu.find(i);
            if(mark[v]) continue;
            dfs(v);
        }
        for(int i = 0;i < n;i++){
            mark[i] = 0;
        }
        while(!kosaraju.empty()){
            int v = kosaraju.back();
            kosaraju.pop_back();
            if(mark[v]) continue;
            dfs2(v, v);
        }
    }
    int tam = n;
    for(int i = 0;i < n;i++){
        if(g[dsu.find(i)].empty()) tam = min(tam, dsu.sz[dsu.find(i)]);
    }
    vector <int> ans;
    for(int i = 0;i < n;i++){
        if(tam == dsu.sz[dsu.find(i)] and g[dsu.find(i)].empty()) ans.push_back(1);
        else ans.push_back(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...