Submission #1226979

#TimeUsernameProblemLanguageResultExecution timeMemory
1226979Hamed_GhaffariWerewolf (IOI18_werewolf)C++20
100 / 100
528 ms100476 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

const int MXN = 2e5+5;

vector<int> g[MXN], ch[2][MXN], Q[MXN], tmp[MXN];
int dsu[MXN], wh[MXN];

int find(int v) { return v==dsu[v] ? v : dsu[v]=find(dsu[v]); }
void merge(int u, int v, int id) {
    u = find(u), v = find(v);
    if(u==v) return;
    ch[id][dsu[v] = u].push_back(v);
}

int stt[MXN], fnt[MXN], timer;
vector<int> ans;

void dfs1(int v) {
    stt[v] = timer++;
    for(int u : ch[1][v])
        dfs1(u);
    fnt[v] = timer;
}

set<int> st[MXN];
void dfs0(int v) {
    for(int u : ch[0][v]) {
        dfs0(u);
        if(st[v].size()<st[u].size()) st[v].swap(st[u]);
        for(int x : st[u]) st[v].insert(x);
        st[u].clear();
    }
    st[v].insert(stt[v]);
    for(int i : Q[v]) {
        auto it = st[v].lower_bound(stt[wh[i]]);
        if(it!=st[v].end() && (*it)<fnt[wh[i]]) ans[i] = 1;
    }
}

vector<int> check_validity(int N, vector<int> X, vector<int> Y, vector<int> S, vector<int> E, vector<int> L, vector<int> R) {
    for(int i=0; i<X.size(); i++) {
        g[X[i]].push_back(Y[i]);
        g[Y[i]].push_back(X[i]);
    }
    for(int i=0; i<L.size(); i++) tmp[L[i]].push_back(i);
    iota(dsu, dsu+N, 0);
    for(int i=N-1; i>=0; i--) {
        for(int j : g[i])
            if(j>i)
                merge(i, j, 0);
        for(int j : tmp[i])
            Q[find(S[j])].push_back(j);
    }
    for(int i=0; i<N; i++) tmp[i].clear();
    for(int i=0; i<R.size(); i++) tmp[R[i]].push_back(i);
    iota(dsu, dsu+N, 0);
    for(int i=0; i<N; i++) {
        for(int j : g[i])
            if(j<i)
                merge(i, j, 1);
        for(int j : tmp[i])
            wh[j] = find(E[j]);
    }
    dfs1(N-1);
    ans = vector<int>(L.size(), 0);
    dfs0(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...