제출 #1236798

#제출 시각아이디문제언어결과실행 시간메모리
1236798nikd늑대인간 (IOI18_werewolf)C++20
15 / 100
339 ms589824 KiB
#include "werewolf.h"
#include <bits/stdc++.h>
using namespace std;

struct dsu{
  vector<int> p;
  vector<int> sz;
  dsu(int n){
    p.resize(n);
    iota(p.begin(), p.end(), 0);
    sz.resize(n, 1);
  }
  int find(int v){
    return p[v] == v ? v : p[v] = find(p[v]);
  }
  void merge(int a, int b){
    a = find(a); b = find(b);
    if(a==b) return;
    if(sz[a] < sz[b]) swap(a, b);
    p[b] = a;
    sz[a] += sz[b];
    return;
  }
};

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) {
  vector<dsu> l(N, dsu(N));
  vector<dsu> r(N, dsu(N));
  vector<vector<int>> adj(N);
  for(int i = 0; i<X.size(); i++){
    adj[X[i]].push_back(Y[i]);
    adj[Y[i]].push_back(X[i]);
  }
  for(int i = N-1; i>=0; i--){
    if(i<N-1) l[i] = l[i+1];
    for(int u: adj[i]){
      if(u>i) l[i].merge(i, u);
    }
  }
  for(int i= 0; i<N; i++){
    if(i>0) r[i] = r[i-1];
    for(int u: adj[i]){
      if(u<i) r[i].merge(i, u);
    }
  }
  vector<int> sol(S.size(), 0);
  for(int i = 0; i<S.size(); i++){
    for(int j = L[i]; j<=R[i]; j++){
      if(l[L[i]].find(j) == l[L[i]].find(S[i]) && r[R[i]].find(j) == r[R[i]].find(E[i])) sol[i] = 1;
    }
  }
  return sol;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...