제출 #290840

#제출 시각아이디문제언어결과실행 시간메모리
290840davi_bart게임 (IOI14_game)C++14
42 / 100
737 ms14712 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(40,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...