# | 제출 시각 | 아이디 | 문제 | 언어 | 결과 | 실행 시간 | 메모리 |
---|---|---|---|---|---|---|---|
113596 | MladenP | 게임 (IOI14_game) | C++17 | 0 ms | 0 KiB |
이 제출은 이전 버전의 oj.uz에서 채점하였습니다. 현재는 제출 당시와는 다른 서버에서 채점을 하기 때문에, 다시 제출하면 결과가 달라질 수도 있습니다.
#include "grader.h"
#include <bits/stdc++.h>
#define STIZE(x) fprintf(stderr, "STIZE%d\n", x);
#define PRINT(x) fprintf(stderr, "%s = %d\n", #x, x);
#define NL(x) printf("%c", " \n"[(x)]);
#define lld long long
#define pii pair<int,int>
#define pb push_back
#define fi first
#define se second
#define all(a) begin(a),end(a)
#define sz(a) int((a).size())
#define LINF LLONG_MAX
#define INF INT_MAX
#define EPS 1e-9
#define MAXN 1510
using namespace std;
struct uNode {
int parent, cnt;
};
uNode dsu[MAXN];
int edges[MAXN][MAXN];
int Root(int x) {
while(x != dsu[x].parent) {
dsu[x].parent = dsu[dsu[dsu[x].parent].parent].parent;
x = dsu[x].parent;
}
return x;
}
int N;
void Connect(int a, int b) {
int rootA = Root(a), rootB = Root(b);
if(dsu[rootA].cnt > dsu[rootB].cnt) {
dsu[rootB].parent = rootA;
dsu[rootA].cnt += dsu[rootB].cnt;
for(int i = 1; i <= N; i++) {
edges[min(i, rootA)][max(i, rootA)] += edges[min(i, rootB)][max(i, rootB)];
}
}
else {
dsu[rootA].parent = rootB;
dsu[rootB].cnt += dsu[rootA].cnt;
for(int i = 0; i < N; i++) {
edges[min(i, rootB)][max(i, rootB)] += edges[min(i, rootA)][max(i, rootA)];
}
}
}
void initialize(int n) {
N = n;
for(int i = 0; i < n; i++) {
dsu[i].parent = i; dsu[i].cnt = 1;
}
}
int hasEdge(int u, int v) {
int rootV = Root(v), rootU = Root(u);
int minn = min(rootV, rootU); rootU = max(rootU, rootV), rootV = minn;
int totEdges = dsu[rootV].cnt*dsu[rootU].cnt-edges[rootV][rootU];
///PRINT(totEdges);
///PRINT(dsu[rootV].cnt);
///PRINT(totEdges);
if(totEdges == 1) return Connect(rootV, rootU), 1;
else return edges[rootV][rootU]++, 0;
}
/*
int main() {
int n; scanf("%d", &n);
initialize(n);
for(int i = 0; i < (n-1)*n/2; i++) {
int x, y; scanf("%d%d", &x, &y);
printf("%d\n", hasEdge(x, y));
}
}
*/