Submission #1066164

#TimeUsernameProblemLanguageResultExecution timeMemory
1066164kkkkkkkkConnecting Supertrees (IOI20_supertrees)C++14
100 / 100
147 ms24200 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; int parent[1005], sz[1005], parent2[1005], sz2[1005]; int Find(int x) { if (x==parent[x]) return x; return parent[x]=Find(parent[x]); } int Find2(int x) { if (x==parent2[x]) return x; return parent2[x]=Find2(parent2[x]); } void Union(int a, int b) { a=Find(a), b=Find(b); if (a==b) return; if (sz[a]<sz[b]) swap(a, b); sz[a]+=sz[b]; parent[b]=a; } void Union2(int a, int b) { a=Find2(a), b=Find2(b); if (a==b) return; if (sz2[a]<sz2[b]) swap(a, b); sz2[a]+=sz2[b]; parent2[b]=a; } int construct(vector<vector<int> > paths) { int n=paths.size(); vector<vector<int> > a(n, vector<int> (n, 0)); for (int i=0;i<n;i++) sz[i]=1, parent[i]=i, sz2[i]=1, parent2[i]=i; for (int i=0;i<n;i++) for (int j=i+1;j<n;j++) { if (paths[i][j]==3) return 0; else if (paths[i][j]) Union(i, j); } vector<int> gr[n]; for (int i=0;i<n;i++) { int lider=Find(i); gr[lider].push_back(i); } for (int i=0;i<n;i++) { if (!gr[i].size()) continue; for (auto x:gr[i]) for (auto y:gr[i]) if (!paths[x][y]) return 0; vector<int> roots; for (int j=0;j<gr[i].size();j++) { int x=gr[i][j]; for (int k=j+1;k<gr[i].size();k++) { int y=gr[i][k]; if (paths[x][y]==1) Union2(x, y); } } for (int j=0;j<gr[i].size();j++) { int x=gr[i][j]; for (int k=j+1;k<gr[i].size();k++) { int y=gr[i][k]; if (paths[x][y]==2&&Find2(x)==Find2(y)) return 0; } } for (auto x:gr[i]) { if (Find2(x)==x) roots.push_back(x); else a[x][parent2[x]]=1, a[parent2[x]][x]=1; } if (roots.size()<=1) continue; if (roots.size()==2) return 0; int x=roots[0], y=roots[roots.size()-1]; for (int j=0;j<roots.size()-1;j++) a[roots[j]][roots[j+1]]=1, a[roots[j+1]][roots[j]]=1; a[x][y]=1, a[y][x]=1; } build(a); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:60:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |         for (int j=0;j<gr[i].size();j++) {
      |                      ~^~~~~~~~~~~~~
supertrees.cpp:62:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   62 |             for (int k=j+1;k<gr[i].size();k++) {
      |                            ~^~~~~~~~~~~~~
supertrees.cpp:67:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   67 |         for (int j=0;j<gr[i].size();j++) {
      |                      ~^~~~~~~~~~~~~
supertrees.cpp:69:29: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   69 |             for (int k=j+1;k<gr[i].size();k++) {
      |                            ~^~~~~~~~~~~~~
supertrees.cpp:81:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   81 |         for (int j=0;j<roots.size()-1;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...