제출 #1332749

#제출 시각아이디문제언어결과실행 시간메모리
1332749activedeltorre늑대인간 (IOI18_werewolf)C++20
0 / 100
319 ms98404 KiB
#include "werewolf.h"
#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <vector>
//#include "werewolf.h"
using namespace std;
vector<int>adj[200005];
int ord[2000005],timp=0;
int poz[200005];
int maxim[800005];
int minim[800005];
void dfs(int curr,int par)
{
    ord[timp+1]=curr;
    poz[curr]=timp+1;
    timp++;
    for(auto k:adj[curr])
    {
        if(k!=par)
        {
            dfs(k,curr);
        }
    }
}
void build(int node,int st,int dr)
{
    if(st==dr)
    {
        maxim[node]=ord[st];
        minim[node]=ord[st];
        return;
    }
    int mij=(st+dr)/2;
    build(node*2,st,mij);
    build(node*2+1,mij+1,dr);
    maxim[node]=max(maxim[node*2],maxim[node*2+1]);
    minim[node]=min(minim[node*2],minim[node*2+1]);
}
int best;
void findfirst(int node,int st,int dr,int qst,int qdr,int lower,int upper)
{
    if(st>qdr || st>dr || qst>dr || qst>qdr)
    {
        return;
    }
    int mij=(st+dr)/2;
    if(qst<=st && dr<=qdr)
    {
        if(maxim[node]<lower || minim[node]>upper)
        {
            return;
        }
        if(st==dr)
        {
            best=min(best,st);
            return;
        }
        else
        {
            if(maxim[node*2]<lower || minim[node*2]>upper)
            {
                findfirst(node*2+1,mij+1,dr,qst,qdr,lower,upper);
            }
            else
            {
                findfirst(node*2,st,mij,qst,qdr,lower,upper);
            }
        }
        return;
    }
    findfirst(node*2,st,mij,qst,qdr,lower,upper);
    findfirst(node*2+1,mij+1,dr,qst,qdr,lower,upper);
}
int best2;
void findlast(int node,int st,int dr,int qst,int qdr,int lower,int upper)
{
    if(st>qdr || st>dr || qst>dr || qst>qdr)
    {
        return;
    }
    int mij=(st+dr)/2;
    if(qst<=st && dr<=qdr)
    {
        if(maxim[node]<lower || minim[node]>upper)
        {
            return;
        }
        if(st==dr)
        {
            best2=max(best2,st);
            return;
        }
        else
        {
            if(maxim[node*2+1]<lower || minim[node*2+1]>upper)
            {
                findlast(node*2,st,mij,qst,qdr,lower,upper);
            }
            else
            {
                findlast(node*2+1,mij+1,dr,qst,qdr,lower,upper);
            }
        }
        return;
    }
    findlast(node*2,st,mij,qst,qdr,lower,upper);
    findlast(node*2+1,mij+1,dr,qst,qdr,lower,upper);
}
std::vector<int> check_validity(int N, std::vector<int> X, std::vector<int> Y,
                                std::vector<int> S, std::vector<int> E,
                                std::vector<int> L, std::vector<int> R) {
    int n=N,dim;
    int m=X.size();
    int q=S.size();
    vector<int>rasp;
    int root=0;
    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<m;i++)
    {
        if(adj[i].size()==1)
        {
            root=i;
        }
    }
    dfs(root,-1);
    build(1,1,n);
    for(int i=0;i<q;i++)
    {
        int rez;
        best=n+1;
        best2=-1;
        if(poz[S[i]]<poz[E[i]])
        {
            findlast(1,1,n,poz[S[i]],poz[E[i]],R[i]+1,n-1);
            findfirst(1,1,n,poz[S[i]],poz[E[i]],0,L[i]-1);
            if(best==n+1 || best2==-1)
            {
                rez=1;
            }
            else if(best2+1<best)
            {
                rez=1;
            }
            else
            {
                rez=0;
            }
            rasp.push_back(rez);
        }
        else
        {
            findlast(1,1,n,poz[S[i]],poz[E[i]],0,L[i]-1);
            findfirst(1,1,n,poz[S[i]],poz[E[i]],R[i]+1,n-1);
            if(best==n+1 || best2==-1)
            {
                rez=1;
            }
            else if(best2+1<best)
            {
                rez=1;
            }
            else
            {
                rez=0;
            }
            rasp.push_back(rez);
        }
    }
    return rasp;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...