제출 #1324303

#제출 시각아이디문제언어결과실행 시간메모리
1324303nicolo_010게임 (IOI14_game)C++20
100 / 100
248 ms15924 KiB
#include "game.h" #include <bits/stdc++.h> using namespace std; struct DSU { vector<int> rank, parent; void init(int n) { rank.assign(n, 1); parent.resize(n); for (int i=0; i<n; i++) { parent[i] = i; } } int find(int n) { return (n == parent[n] ? n : parent[n] = find(parent[n])); } bool sameComponent(int n1, int n2) { int p1 = find(n1); int p2 = find(n2); return p1==p2; } void unite(int n1, int n2) { int p1 = find(n1); int p2 = find(n2); if (p1==p2) return; if (rank[p1] >= rank[p2]) { rank[p1] += rank[p2]; parent[p2] = p1; } else { rank[p2] += rank[p1]; parent[p1] = p2; } } }; DSU dsu; int n; vector<vector<int>> s; void initialize(int _n) { n = _n; s.assign(n, vector<int>(n, 1)); for (int i=0; i<n; i++) { s[i][i] = 0; } dsu.init(n); } int hasEdge(int u, int v) { if (dsu.sameComponent(u, v)) return 0; int pu = dsu.find(u); int pv = dsu.find(v); bool ans = (s[pu][pv] == 1); if (ans==0) { s[pu][pv]--; s[pv][pu]--; //cout << s[pu][pv] << " " << pu << " " << pv << endl; } else { dsu.unite(u, v); int w = dsu.find(u); vector<bool> vis(n); for (int i=0; i<n; i++) { int x = dsu.find(i); if (!vis[x]) { vis[x] = true; s[w][x] = s[x][w] = s[pu][x] + s[pv][x]; } } } return ans; }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...