제출 #837911

#제출 시각아이디문제언어결과실행 시간메모리
837911mathematik슈퍼트리 잇기 (IOI20_supertrees)C++17
11 / 100
170 ms21984 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; struct setunion{ int N; vector<int> p, s; setunion(int n) { N = n; p = vector<int>(N, -1); s = vector<int>(N, 1); } int root(int n) { int i = n; while (p[i] != -1) i = p[i]; return i; } void combine(int a, int b) { int ra = root(a), rb = root(b); if (ra == rb) return; if (s[ra] < s[rb]) swap(ra, rb); s[ra] += s[rb]; p[rb] = ra; } vector<vector<int>> extract() { vector<vector<int>> erg(N), rem; for (int i = 0; i < N; i++) { erg[root(i)].push_back(i); } for (vector<int> e: erg) if (e.size()) rem.push_back(e); return rem; } }; int construct(vector<vector<int>> p) { int N = p.size(); int c = 0, o = 0; setunion zsm(N); for (int i = 0; i < N; i++) { for (int j = 0; j < N; j++) { if (p[i][j] == 3) return 0; if (p[i][j]) zsm.combine(i, j); if (p[i][j] == 1 || i == j) o++; if (p[i][j] || i == j) c++; } } vector<vector<int>> graph = vector<vector<int>>(N, vector<int>(N)); for (vector<int> z: zsm.extract()) { c -= z.size() * z.size(); setunion one(z.size()); for (int i = 0; i < z.size(); ++i) { for (int j = 0; j < z.size(); ++j) { if (p[z[i]][z[j]] == 1) one.combine(i, j); } } vector<vector<int>> g = one.extract(); for (int i = 0; i < g.size(); i++) { graph[z[g[i][0]]][z[g[(i + 1) % g.size()][0]]] = true; graph[z[g[(i + 1) % g.size()][0]]][z[g[i][0]]] = true; } for (int i = 0; i < g.size(); i++) { o -= g[i].size() * g[i].size(); for (int j = 1; j < g[i].size(); j++) { graph[z[g[i][0]]][z[g[i][j]]] = true; graph[z[g[i][j]]][z[g[i][0]]] = true; } for (int j: g[i]) for (int k: g[i]) if (p[z[j]][z[k]] != 1) return 0; } for (int i: z) for (int j: z) if (p[z[i]][z[j]] == 0) return 0; } for (int i = 0; i < N; i++) graph[i][i] = false; if (c != 0 || o != 0) return 0; build(graph); return 1; }

컴파일 시 표준 에러 (stderr) 메시지

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:69:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |   for (int i = 0; i < z.size(); ++i)
      |                   ~~^~~~~~~~~~
supertrees.cpp:71:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |    for (int j = 0; j < z.size(); ++j)
      |                    ~~^~~~~~~~~~
supertrees.cpp:80:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   80 |   for (int i = 0; i < g.size(); i++)
      |                   ~~^~~~~~~~~~
supertrees.cpp:86:21: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   86 |   for (int i = 0; i < g.size(); i++)
      |                   ~~^~~~~~~~~~
supertrees.cpp:89:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   89 |    for (int j = 1; j < g[i].size(); j++)
      |                    ~~^~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...