제출 #315523

#제출 시각아이디문제언어결과실행 시간메모리
315523qpwoeirut게임 (IOI14_game)C++17
100 / 100
532 ms25336 KiB
#include <bits/stdc++.h> #include "game.h" const int MN = 1501; using namespace std; int N; int rt[MN]; int sz[MN]; int root(int u) { if (rt[u] != u) { rt[u] = root(rt[u]); } return rt[u]; } int ct[MN][MN]; void join(int u, int v) { int ru = root(u), rv = root(v); if (sz[ru] < sz[rv]) { swap(ru, rv); } for (int i=0; i<N; ++i) { //if (root(i) == i) ct[ru][i] += ct[rv][i]; ct[i][ru] = ct[ru][i]; } rt[rv] = ru; sz[ru] += sz[rv]; //cerr << "ru,rv: " << ru << ' ' << root(rv) << endl; } void initialize(int n) { N = n; for (int i=0; i<N; ++i) { for (int j=0; j<N; ++j) { ct[i][j] = 0; } rt[i] = i; sz[i] = 1; } } int hasEdge(int u, int v) { int ru = root(u), rv = root(v); ++ct[ru][rv]; ct[rv][ru] = ct[ru][rv]; int ret = 0; if (ct[ru][rv] == sz[ru] * sz[rv] && ct[rv][ru] == sz[ru] * sz[rv]) { join(u, v); //cerr << "ru,rv: " << root(u) << ' ' << root(v) << endl; //cerr << "joined u,v: " << u << ' ' << v << endl; ret = 1; } //cerr << "u,v: " << u << ' ' << v << ' ' << endl << "ru,rv,su,sv,ctu,ctv: " << ru << ' ' << rv << ' ' << sz[ru] << ' ' << sz[rv] << ' ' << ct[ru][rv] << ' ' << ct[rv][ru] << endl; //for (int i=0; i<N; ++i) { cerr << root(i) << ' '; } cerr << endl; //for (int i=0; i<N; ++i) {for (int j=0; j<N; ++j) cerr << ((root(i) == i && root(j) == j) ? ct[i][j] : 0) << ' '; cerr << endl;} cerr << endl; return ret; } /* 4 2 3 1 3 0 2 0 1 1 2 0 3 5 0 1 0 2 0 3 1 4 2 4 3 4 0 4 1 2 1 3 2 3 5 0 1 0 2 0 3 0 4 1 2 1 3 1 4 3 4 2 3 2 4 */
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...