Submission #302282

#TimeUsernameProblemLanguageResultExecution timeMemory
302282urd05Connecting Supertrees (IOI20_supertrees)C++14
100 / 100
286 ms22264 KiB
#include "supertrees.h" #include <vector> #include <bits/stdc++.h> using namespace std; struct UnionFind { int p[1000]; void init() { memset(p,-1,sizeof(p)); } int find(int a) { if (p[a]<0) { return a; } return p[a]=find(p[a]); } void merge(int a,int b) { a=find(a); b=find(b); if (a==b) { return; } p[b]=a; } }; bool used[1000]; int construct(vector<vector<int>> v) { int n = v.size(); vector<vector<int>> ret(n,vector<int>(n)); UnionFind uf; uf.init(); bool flag3=false; for (int i = 0; i < n; i++) { for(int j=0;j<n;j++) { if (v[i][j]!=0) { uf.merge(i,j); if (v[i][j]==3) { flag3=true; } } } } if (flag3) { if (n!=4) { return 0; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if (i!=j&&v[i][j]!=3) { return 0; } if (i==j&&v[i][j]!=1) { return 0; } } } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if (i==j) { ret[i][j]=0; } ret[i][j]=1; } } ret[0][3]=0; ret[3][0]=0; build(ret); return 1; } for(int i=0;i<n;i++) { for(int j=0;j<n;j++) { if (v[i][j]!=0) { if (uf.find(i)!=uf.find(j)) { return 0; } } else { if (uf.find(i)==uf.find(j)) { return 0; } } } } for(int i=0;i<n;i++) { if (!used[i]) { vector<int> save; save.push_back(i); used[i]=true; for(int j=i+1;j<n;j++) { if (uf.find(j)==uf.find(i)) { save.push_back(j); used[j]=true; } } UnionFind uf2; uf2.init(); for(int j=0;j<save.size();j++) { for(int k=0;k<save.size();k++) { if (v[save[j]][save[k]]==1) { uf2.merge(save[j],save[k]); } } } for(int j=0;j<save.size();j++) { for(int k=0;k<save.size();k++) { if (v[save[j]][save[k]]!=1) { if (uf2.find(save[j])==uf2.find(save[k])) { return 0; } } } } bool used2[1000]; memset(used2,0,sizeof(used2)); vector<int> cycle; for(int j=0;j<save.size();j++) { if (!used2[save[j]]) { used2[save[j]]=true; cycle.push_back(save[j]); for(int k=j+1;k<save.size();k++) { if (!used2[save[k]]&&uf2.find(save[j])==uf2.find(save[k])) { used2[save[k]]=true; ret[save[j]][save[k]]=1; ret[save[k]][save[j]]=1; } } } } if (cycle.size()==2) { return 0; } if (cycle.size()==1) { continue; } for(int j=0;j+1<cycle.size();j++) { ret[cycle[j]][cycle[j+1]]=1; ret[cycle[j+1]][cycle[j]]=1; } ret[cycle.back()][cycle[0]]=1; ret[cycle[0]][cycle.back()]=1; } } build(ret); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:99:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   99 |          for(int j=0;j<save.size();j++) {
      |                      ~^~~~~~~~~~~~
supertrees.cpp:100:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  100 |              for(int k=0;k<save.size();k++) {
      |                          ~^~~~~~~~~~~~
supertrees.cpp:106:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  106 |          for(int j=0;j<save.size();j++) {
      |                      ~^~~~~~~~~~~~
supertrees.cpp:107:27: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  107 |              for(int k=0;k<save.size();k++) {
      |                          ~^~~~~~~~~~~~
supertrees.cpp:118:23: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  118 |          for(int j=0;j<save.size();j++) {
      |                      ~^~~~~~~~~~~~
supertrees.cpp:122:33: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  122 |                  for(int k=j+1;k<save.size();k++) {
      |                                ~^~~~~~~~~~~~
supertrees.cpp:137:25: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
  137 |          for(int j=0;j+1<cycle.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...