Submission #310627

#TimeUsernameProblemLanguageResultExecution timeMemory
310627vipghn2003Werewolf (IOI18_werewolf)C++14
100 / 100
1060 ms151548 KiB
#include <bits/stdc++.h>

using namespace std;

const int N=4e5+5;
int n,m,q,par[N],sz[N],l[N],st[N],en[N],now[N],nsz[N];
vector<int>adj[N],g[N],event[N];
set<int>node[N];

int Find(int u)
{
    if(par[u]==u) return u;
    return par[u]=Find(par[u]);
}

void Union(int u,int v,bool type)
{
    u=Find(u);
    v=Find(v);
    if(u==v) return;
    if(sz[u]<sz[v]) swap(u,v);
    if(!type) g[u].push_back(v);
    else for(auto&it:node[v]) node[u].insert(it);
    par[v]=u;
    sz[u]+=sz[v];
}

void dfs(int u)
{
    static int nTime=0;
    l[u]=++nTime;
    for(auto &v:g[u]) dfs(v);
}

vector<int>check_validity(int _n,vector<int> X,vector<int> Y,vector<int> S,vector<int> E,vector<int> L,vector<int> R)
{
    n=_n;
    m=X.size();
    q=S.size();
    vector<int>res(q,0);
    iota(par,par+n,0);
    fill(sz,sz+n,1);
    for(int i=0;i<m;i++)
    {
        adj[X[i]].push_back(Y[i]);
        adj[Y[i]].push_back(X[i]);
    }
    for(int i=0;i<q;i++) event[L[i]].push_back(i);
    for(int i=n-1;i>=0;i--)
    {
        for(auto&e:adj[i]) if(e>i) Union(e,i,0);
        for(auto&id:event[i])
        {
            int u=Find(S[id]);
            now[id]=u;
            nsz[id]=sz[u];
        }
        event[i].clear();
    }
    for(int i=0;i<n;i++)
    {
        if(par[i]==i)
        {
            dfs(i);
            break;
        }
    }
    for(int i=0;i<q;i++)
    {
        st[i]=l[now[i]];
        en[i]=l[now[i]]+nsz[i]-1;
        event[R[i]].push_back(i);
    }
    for(int i=0;i<n;i++) node[i].insert(l[i]);
    iota(par,par+n,0);
    fill(sz,sz+n,1);
    for(int i=0;i<n;i++)
    {
        for(auto&j:adj[i]) if(j<i) Union(i,j,1);
        for(auto&id:event[i])
        {
            int u=Find(E[id]);
            auto it=node[u].lower_bound(st[id]);
            if(it!=node[u].end()&&*(it)<=en[id]) res[id]=1;
        }
    }
    return res;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...