제출 #136173

#제출 시각아이디문제언어결과실행 시간메모리
136173OptxPrime게임 (IOI14_game)C++11
100 / 100
515 ms25360 KiB
#include <iostream> #include <vector> #include <cmath> #include <algorithm> #include<queue> #include<map> #include<string.h> using namespace std; #define pb push_back #define mp make_pair #define fb find_best int n; int rank1[1510],p[1510]; // map<int,int> d; int d[1510][1510]; int sz[1510]; int findset( int x ) { if( p[x]!=x ) return p[x]=findset( p[x] ); else return x; } void uniset( int x, int y ) { //if( issameset( x,y ) ) return; int a=findset(x); int b=findset(y); if( rank1[a] > rank1[b] ){ p[b]=a; for( int i=0;i<n;i++ ){ d[a][i]+=d[b][i]; d[i][a]+=d[i][b]; } sz[a]+=sz[b]; } else{ p[a]=b; for(int i=0;i<n;i++){ d[b][i]+=d[a][i]; d[i][b]+=d[i][a]; } sz[b]+=sz[a]; if( rank1[a]==rank1[b] ) rank1[b]++; } } void initialize(int N) { n=N; for( int i=0;i<n;i++ ){ rank1[i]=0; p[i]=i; sz[i]=1; for( int j=0;j<n;j++ ) d[i][j]=0; } } int hasEdge(int u, int v) { int a=findset(u); int b=findset(v); d[a][b]++; d[b][a]++; if( d[a][b]== sz[a]*sz[b] ){ uniset( a,b ); return 1; } else return 0; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...