제출 #599497

#제출 시각아이디문제언어결과실행 시간메모리
599497DanerZeinGame (APIO22_game)C++17
60 / 100
4032 ms43464 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
typedef vector<int> vi;
const int MAX_N=3e5+10;
vector<vi> I;
vector<vi> G;
int fr[MAX_N];
int to[MAX_N];
int K,N;
void init(int n, int k) {
  K=k;
  N=n;
  G.resize(n+1);
  I.resize(n+1);
  for(int i=0;i<=n;i++) fr[i]=1e9;
  memset(to,-1,sizeof to);
}
bool updateG(int u){
  bool ans=0;
  if(to[u]>=fr[u]) return 1;
  for(auto &v:G[u]){
    int val;
    if(u<K) val=u;
    else val=to[u];
    if(to[v]<val){
      to[v]=val;
      ans|=updateG(v);
    }
  }
  return ans;
}
bool updateI(int u){
  bool ans=0;
  if(to[u]>=fr[u]) return 1;
  for(auto &v:I[u]){
    int val;
    if(u<K) val=u;
    else val=fr[u];
    if(val<fr[v]){
      fr[v]=val;
      ans|=updateI(v);
    }
  }
  return ans;
}
int add_teleporter(int u, int v) {
  if(u<K && v<K){
    if(u>=v) return 1;
    return 0;
  }
  G[u].push_back(v);
  I[v].push_back(u);
  if(u<K){
    to[v]=max(to[v],u);
  }
  if(v<K){
    fr[u]=min(fr[u],v);
  }
  /* for(int i=0;i<3;i++)
    cout<<to[i]<<" ";
  cout<<endl;
  for(int i=0;i<3;i++)
    cout<<fr[i]<<" ";
  cout<<endl;*/
  bool s1=updateG(u)|updateG(v);
  bool s2=updateI(v)|updateI(u);
  return s1|s2;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...