Submission #433580

#TimeUsernameProblemLanguageResultExecution timeMemory
433580sean617Connecting Supertrees (IOI20_supertrees)C++17
100 / 100
302 ms23176 KiB
#include "supertrees.h" #include <vector> #include <cstring> #define N 1005 using namespace std; int n, cnt, bu[N], bu2[N], gut[N]; bool v[N], co[N][N], icy[N]; vector<int> gu[N], cy[N], cy2, ans, ch[N]; vector<std::vector<int> > answer; int f(int p) { if (bu[p] == p) return p; else return bu[p] = f(bu[p]); } int f2(int p) { if (bu2[p] == p) return p; else return bu2[p] = f2(bu2[p]); } void f_co(int p, int q) { co[p][q] = co[q][p] = 1; } int construct(std::vector<std::vector<int> > p) { int i, j, k, t, t1, t2, la, tcnt; n = p.size(); for (i = 0; i < n; i++) {bu[i] = i; bu2[i] = i;} for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { if (p[i][j]== 0) continue; if (p[i][j] == 3) return 0; t1 = f(i); t2 = f(j); if (t1 != t2) bu[t1] = t2; } } memset(gut, -1, sizeof(gut)); for (i = 0; i < n; i++) f(i); for (i = 0; i < n; i++) { tcnt = 0; for (j = 0; j < n; j++) { if (i == j) continue; if (bu[i] != bu[j]) continue; if (p[i][j] == 0) return 0; if (p[i][j] == 1) { t1 = f2(i); t2 = f2(j); if (t1 != t2) bu2[t1] = t2; tcnt++; } } if (tcnt == 0) { icy[i] = 1; cy[bu[i]].push_back(i); } } for (i = 0; i < n; i++) { for (j = i + 1; j < n; j++) { if (bu2[i] != bu2[j]) continue; if (p[i][j] != 1) return 0; } } for (i = 0; i < n; i++) { if (cy[i].empty()) continue; for (j = 0; j < cy[i].size(); j++) { for (k = j + 1; k < cy[i].size(); k++) { t1 = cy[i][j]; t2 = cy[i][k]; if (p[t1][t2] != 2) return 0; } } } for (i = 0; i < n; i++) { if (icy[i]) continue; for (j = i + 1; j < n; j++) { if (bu[i] != bu[j]) continue; if (bu2[i] == bu2[j] && p[i][j] != 1 || bu2[i] != bu2[j] && p[i][j] != 2) return 0; } if (gut[bu2[i]] == -1) { cy[bu[i]].push_back(i); } else { f_co(gut[bu2[i]], i); } gut[bu2[i]] = i; } for (i = 0; i < n; i++) { if (cy[i].empty() || cy[i].size() == 1) continue; if (cy[i].size() == 2) return 0; int cysz = cy[i].size(); for (j = 0; j < cysz; j++) { t1 = cy[i][j]; t2 = cy[i][(j + 1) % cysz]; f_co(t1, t2); } } for (i = 0; i < n; i++) { ans.clear(); for (j =0; j < n; j++) { ans.push_back(co[i][j]); } answer.push_back(ans); } build(answer); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:66:17: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   66 |   for (j = 0; j < cy[i].size(); j++) {
      |               ~~^~~~~~~~~~~~~~
supertrees.cpp:67:22: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |    for (k = j + 1; k < cy[i].size(); k++) {
      |                    ~~^~~~~~~~~~~~~~
supertrees.cpp:78:25: warning: suggest parentheses around '&&' within '||' [-Wparentheses]
   78 |    if (bu2[i] == bu2[j] && p[i][j] != 1 || bu2[i] != bu2[j] && p[i][j] != 2) return 0;
      |        ~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~
supertrees.cpp:26:18: warning: unused variable 't' [-Wunused-variable]
   26 |     int i, j, k, t, t1, t2, la, tcnt;
      |                  ^
supertrees.cpp:26:29: warning: unused variable 'la' [-Wunused-variable]
   26 |     int i, j, k, t, t1, t2, la, tcnt;
      |                             ^~
#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...