제출 #290839

#제출 시각아이디문제언어결과실행 시간메모리
290839davi_bart게임 (IOI14_game)C++14
15 / 100
25 ms768 KiB
#include "game.h"
#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define fi first
#define se second
#define ld long double
set<int> p[1600];
bool arc[42][42];
int rad,N;
void sist(int a,int b){
  bool ok=0;
  for(int i=rad*a;i<rad*(a+1);i++){
    auto x=p[i].lower_bound(rad*b);
    if(x==p[i].end())continue;
    int y=*x;
    if(y>=rad*b && y<rad*(b+1)){
      ok=1;
      break;
    }
  }
  arc[a][b]=arc[b][a]=ok;
}
int hasEdge(int u, int v) {
    int ga=u/rad,gb=v/rad;
    if(ga==gb){
      p[u].erase(v);
      p[v].erase(u);
      vector<bool> vis(50,0);
      queue<int> q;
      q.push(u);
      while(!q.empty()){
        int pos=q.front();
        q.pop();
        if(pos/rad!=ga)continue;
        if(vis[pos%rad])continue;
        vis[pos%rad]=1;
        auto y=p[pos].lower_bound(rad*ga);
        if(y==p[pos].end())continue;
        while((*y)>=rad*ga && (*y)<rad*(ga+1)){
          q.push(*y);
          y++;
          if(y==p[pos].end())break;
        }
      }
      bool ok=1;
      for(int i=0;i<rad;i++){
        if(vis[i]==0){
          ok=0;
          break;
        }
      }

      if(ok==0){
        p[u].insert(v);
        p[v].insert(u);
        return 1;
      }
      return 0;
    }
    p[u].erase(v);
    p[v].erase(u);
    sist(ga,gb);

    vector<bool> vis(50,0);
    queue<int> q;
    q.push(ga);
    bool ok=0;
    while(!q.empty()){
      int pos=q.front();
      q.pop();
      if(pos==gb){
        ok=1;
        break;
      }
      if(vis[pos])continue;
      vis[pos]=1;
      for(int i=0;i<=((N-1)/rad);i++){
        if(arc[pos][i]==1){
          q.push(i);
        }
      }
    }
    if(ok==0){
      p[u].insert(v);
      p[v].insert(u);
      arc[ga][gb]=arc[gb][ga]=1;
      return 1;
    }
    return 0;
}
void initialize(int n){
  rad=min(38,n);
  N=n;
  for(int i=0;i<n;i++){
    for(int j=0;j<n;j++){
      p[i].insert(j);
    }
  }
  for(int i=0;i<41;i++){
    for(int j=0;j<41;j++){
      arc[i][j]=1;
    }
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...