제출 #1370529

#제출 시각아이디문제언어결과실행 시간메모리
1370529Godgift42Werewolf (IOI18_werewolf)C++20
34 / 100
235 ms41584 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> st1;

void upd1(int v, int tl, int tr, int pos, int val){
    if(tl==tr)st1[v]=val;
    else{
        int tm=(tl+tr)/2;
        if(pos<=tm)upd1(v*2,tl,tm,pos,val);
        else upd1(v*2+1,tm+1,tr,pos,val);
        st1[v]=min(st1[v*2],st1[v*2+1]);
    }
}

int wk1(int v, int tl, int tr, int val){
    if(tl==tr)return tl;
    int tm=(tl+tr)/2;
    if(st1[v]>=val)return tr+1;
    if(st1[v*2]<val)return wk1(v*2,tl,tm,val);
    return wk1(v*2+1,tm+1,tr,val);
}

vector<int> st2;

void upd2(int v, int tl, int tr, int pos, int val){
    if(tl==tr)st2[v]=val;
    else{
        int tm=(tl+tr)/2;
        if(pos<=tm)upd2(v*2,tl,tm,pos,val);
        else upd2(v*2+1,tm+1,tr,pos,val);
        st2[v]=min(st2[v*2],st2[v*2+1]);
    }
}

int wk2(int v, int tl, int tr, int val){
    if(tl==tr)return tl;
    int tm=(tl+tr)/2;
    if(st2[v]>=val)return tl-1;
    if(st2[v*2+1]<val)return wk2(v*2+1,tm+1,tr,val);
    return wk2(v*2,tl,tm,val); 
}

vector<int> st3;

void upd3(int v, int tl, int tr, int pos, int val){
    if(tl==tr)st3[v]=val;
    else{
        int tm=(tl+tr)/2;
        if(pos<=tm)upd3(v*2,tl,tm,pos,val);
        else upd3(v*2+1,tm+1,tr,pos,val);
        st3[v]=max(st3[v*2],st3[v*2+1]);
    }
}

int wk3(int v, int tl, int tr, int val){
    if(tl==tr)return tl;
    int tm=(tl+tr)/2;
    if(st3[v]<=val)return tr+1;
    if(st3[v*2]>val)return wk3(v*2,tl,tm,val);
    return wk3(v*2+1,tm+1,tr,val);
}

vector<int> st4;

void upd4(int v, int tl, int tr, int pos, int val){
    if(tl==tr)st4[v]=val;
    else{
        int tm=(tl+tr)/2;
        if(pos<=tm)upd4(v*2,tl,tm,pos,val);
        else upd4(v*2+1,tm+1,tr,pos,val);
        st4[v]=max(st4[v*2],st4[v*2+1]);
    }
}

int wk4(int v, int tl, int tr, int val){
    if(tl==tr)return tl;
    int tm=(tl+tr)/2;
    if(st4[v]<=val)return tl-1;
    if(st4[v*2+1]>val)return wk4(v*2+1,tm+1,tr,val);
    return wk4(v*2,tl,tm,val); 
}


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 q = S.size();
  int m=X.size();
  int n=N;
  vector<int> a(q,0);
  vector<int> w(n);
  int st=-1;
  vector<vector<int>> adj(n);
  for(int i=0;i<n-1;i++){
    adj[X[i]].push_back(Y[i]);
    adj[Y[i]].push_back(X[i]);
  }
  for(int i=0;i<n;i++){
    if(adj[i].size()==1){
        st=i;
        break;
    }
  }
  vector<int> rev(n);
  vector<int> norm(n);
  norm[0]=st;
  rev[st]=0;
  int pre=st;
  int cr=adj[st][0];
  while(true){
    rev[cr]=rev[pre]+1;
    norm[rev[cr]]=cr;
    int prepre=pre;
    pre=cr;
    if(adj[cr].size()==1)break;
    if(adj[cr][0]==prepre)cr=adj[cr][1];
    else cr=adj[cr][0];
  }
  st1.clear();
  st2.clear();
  st3.clear();
  st4.clear();
  st1.resize(4*n,100000000);
  st2.resize(4*n,100000000);
  st3.resize(4*n,-1);
  st4.resize(4*n,-1);
  vector<pair<int,int>> qu1;
  vector<pair<int,int>> qu2;
  vector<pair<int,int>> qu3;
  vector<pair<int,int>> qu4;
  for(int i=0;i<q;i++){
    if(rev[S[i]]<rev[E[i]]){
        qu1.push_back({rev[S[i]],i});
        qu4.push_back({rev[E[i]],i});
    }
    else{
        qu2.push_back({rev[S[i]],i});
        qu3.push_back({rev[E[i]],i});
    }
  }
  vector<int> l1(q);
  vector<int> r1(q);
  sort(qu1.begin(),qu1.end());
  sort(qu2.begin(),qu2.end());
  int cj=n-1;
  for(int i=qu1.size()-1;i>=0;i--){
    while(cj>=qu1[i].first){
        upd1(1,0,n-1,cj,norm[cj]);
        cj--;
    }
    l1[qu1[i].second]=wk1(1,0,n-1,L[qu1[i].second]);
  }
  cj=0;
  for(int i=0;i<qu2.size();i++){
    while(cj<=qu2[i].first){
        upd2(1,0,n-1,cj,norm[cj]);
        cj++;
    }
    l1[qu2[i].second]=wk2(1,0,n-1,L[qu2[i].second]);
  }
  sort(qu3.begin(),qu3.end());
  sort(qu4.begin(),qu4.end());
  cj=n-1;
  for(int i=qu3.size()-1;i>=0;i--){
    while(cj>=qu3[i].first){
        upd3(1,0,n-1,cj,norm[cj]);
        cj--;
    }
    r1[qu3[i].second]=wk3(1,0,n-1,R[qu3[i].second]);
  }
  cj=0;
  for(int i=0;i<qu4.size();i++){
    while(cj<=qu4[i].first){
        upd4(1,0,n-1,cj,norm[cj]);
        cj++;
    }
    r1[qu4[i].second]=wk4(1,0,n-1,R[qu4[i].second]);
  }
  for(int i=0;i<q;i++){
    if(rev[S[i]]<rev[E[i]]){
        if(l1[i]>r1[i]+1)a[i]=1;
    }
    else{
        if(l1[i]+1<r1[i])a[i]=1;
    }
  }
  return a;
}
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…
#결과 실행 시간메모리채점기 출력
결과를 불러오는 중입니다…