제출 #1278396

#제출 시각아이디문제언어결과실행 시간메모리
1278396k12_khoi늑대인간 (IOI18_werewolf)C++17
100 / 100
844 ms148800 KiB
#include "werewolf.h"

#include <bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define X first
#define Y second

const int N=4e5+5;
const int K=22;
const int oo=1e9+1;

int ori_n,ori_m,ori_request,n,m,request,x,y,u,v;
bool visited[N][2];
vector <int> Xvect,Yvect,Svect,Evect,Lvect,Rvect,adj[N],X,Y,S,E,L,R,ans;

namespace sub4
{
    int h,tour;
    int par[N][2],bit[N],arr[N][2],tin[N][2],tout[N][2],root[2],p[N][K][2];
    vector <int> adj[N][2],g[N];
    vector <pii> query[N];

    int acs(int u,int t)
    {
        if (par[u][t]<0) return u;
        return par[u][t]=acs(par[u][t],t);
    }

    void join(int u,int v,int t)
    {
        int x=acs(u,t);
        int y=acs(v,t);

        if (x!=y)
        {
            par[x][t]+=par[y][t];
            par[y][t]=x;

            root[t]=x;
            adj[x][t].push_back(y);
        }
    }

    void dfs(int u,int t)
    {
        tin[u][t]=++tour;
        arr[tour][t]=u;

        for (int v:adj[u][t])
        {
            p[v][0][t]=u;
            dfs(v,t);
        }

        tout[u][t]=tour;
    }

    void fenwick_update(int u,int v)
    {
        for (int idx=u;idx<=n;idx+=idx&-idx)
        bit[idx]+=v;
    }

    int fenwick_get(int u)
    {
        int ans=0;

        for (int idx=u;idx>0;idx-=idx&-idx)
        ans+=bit[idx];

        return ans;
    }

    void solve()
    {
        for (int i=0;i<m;i++)
        {
            X[i]++;
            Y[i]++;
        }

        for (int i=0;i<request;i++)
        {
            S[i]++;
            E[i]++;
            L[i]++;
            R[i]++;
        }

        for (int i=0;i<m;i++)
        {
            g[X[i]].push_back(Y[i]);
            g[Y[i]].push_back(X[i]);
        }


        for (int i=1;i<=n;i++)
        par[i][0]=par[i][1]=-1;


        for (int i=1;i<=n;i++)
        for (int j:g[i])
        if (i>j) join(i,j,0);

        for (int i=n;i>=1;i--)
        for (int j:g[i])
        if (i<j) join(i,j,1);

        tour=0;
        dfs(root[0],0);

        tour=0;
        dfs(root[1],1);


        h=31-__builtin_clz(n);

        for (int j=1;j<=h;j++)
        for (int i=1;i<=n;i++)
        {
            p[i][j][0]=p[p[i][j-1][0]][j-1][0];
            p[i][j][1]=p[p[i][j-1][1]][j-1][1];
        }

        for (int i=0;i<request;i++)
        {
            int l=L[i],r=R[i],s=S[i],e=E[i];

            for (int j=h;j>=0;j--)
            {
                if (p[s][j][1]>=l) s=p[s][j][1];
                if (p[e][j][0]<=r and p[e][j][0]!=0) e=p[e][j][0];
            }

            query[tout[e][0]].push_back(make_pair(i,1));
            query[tin[e][0]-1].push_back(make_pair(i,-1));

            L[i]=tin[s][1];
            R[i]=tout[s][1];
        }

        for (int i=1;i<=n;i++)
        {
            fenwick_update(tin[arr[i][0]][1],1);

            for (pii j:query[i])
            ans[j.X]+=(fenwick_get(R[j.X])-fenwick_get(L[j.X]-1))*j.Y;
        }

        for (int i=0;i<request;i++)
        ans[i]=(ans[i]>0);
    }
}

vector <int> check_validity(int originN,vector <int> originX,vector <int> originY,vector <int> originS,vector <int> originE,vector <int> originL,vector <int> originR)
{
    n=originN;
    m=originX.size();
    request=originS.size();

    X=originX;
    Y=originY;
    for (int i=0;i<m;i++)
    {
        x=X[i];
        y=Y[i];

        adj[x].push_back(y);
        adj[y].push_back(x);
    }

    S=originS;
    E=originE;
    L=originL;
    R=originR;

    ans.resize(request);
    sub4::solve();

    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...