Submission #1038701

#TimeUsernameProblemLanguageResultExecution timeMemory
1038701boyliguanhanWerewolf (IOI18_werewolf)C++17
100 / 100
492 ms126036 KiB
#include "werewolf.h"
#include<bits/stdc++.h>
using namespace std;
#define M 200100
typedef vector<int> VI;
struct dsu{
  int par[M];
  int abp(int n){
    return par[n]?par[n]=abp(par[n]):n;
  }
  int merge(int a,int b){
    a++;b++;
    a=abp(a),b=abp(b);
    if(a-b)par[a]=b;
    return a!=b;
  }
} dsuhuman,dsuwolf;
int bjh[M][20],bjw[M][20],in[M],out[M],CC;
vector<pair<int,int>>qry[M];
set<int>st[M];
VI EDGES[M],adjh[M],adjw[M];
vector<int>ans;
void dfsw(int n){
  in[n]=++CC;
  for(auto i:adjw[n])
    dfsw(i);
  out[n]=CC;
}
void merge(int a,int b){
  if(st[a].size()<st[b].size())
    swap(st[a],st[b]);
  for(auto i:st[b])
    st[a].insert(i);
  st[b].clear();
}
void dfsans(int n){
  st[n].insert(in[n]);
  for(auto i:adjh[n])
    dfsans(i),merge(n,i);
  for(auto[i,x]:qry[n])
    ans[i]=st[n].lower_bound(in[x])!=
          st[n].upper_bound(out[x]);
}
VI check_validity(int N,VI X,VI Y,VI S,VI E,VI L,VI R) {
  for(int i=0;i<X.size();i++)
    EDGES[X[i]].push_back(Y[i]),
    EDGES[Y[i]].push_back(X[i]);
  for(int i=N;i--;)
    for(auto k:EDGES[i]) {
      if(k<i)continue;
      int x=dsuhuman.abp(k+1)-1;
      if(x==i) continue;
      bjh[x][0]=i,adjh[i].push_back(x);
      dsuhuman.merge(x,i);
    }
  for(int i=0;i<N;i++)
    for(auto k:EDGES[i]) {
      if(k>i)continue;
      int x=dsuwolf.abp(k+1)-1;
      if(x==i) continue;
      bjw[x][0]=i,adjw[i].push_back(x);
      dsuwolf.merge(x,i);
    }
  bjw[N-1][0]=bjw[N][0]=N;
  for(int j=1;j<20;j++)
    for(int i=0;i<=N;i++)
      bjw[i][j]=bjw[bjw[i][j-1]][j-1],
      bjh[i][j]=bjh[bjh[i][j-1]][j-1];
  dfsw(N-1);
  int Q=S.size();
  ans=S;
  for(int i=0;i<Q;i++){
    int l=L[i],r=R[i],s=S[i],e=E[i];
    for(int i=20;i--;)
      if(bjh[s][i]>=l)
        s=bjh[s][i];
    for(int i=20;i--;)
      if(bjw[e][i]<=r)
        e=bjw[e][i];
    qry[s].push_back({i,e});
  }
  dfsans(0);
  return ans;
}

Compilation message (stderr)

werewolf.cpp: In function 'VI check_validity(int, VI, VI, VI, VI, VI, VI)':
werewolf.cpp:45:16: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   45 |   for(int i=0;i<X.size();i++)
      |               ~^~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...