Submission #584472

#TimeUsernameProblemLanguageResultExecution timeMemory
584472TimDeeConnecting Supertrees (IOI20_supertrees)C++14
56 / 100
279 ms24012 KiB
#include "supertrees.h" #include <bits/stdc++.h> using namespace std; #define forn(i,n) for (int i=0; i<n; ++i) #define all(a) a.begin(), a.end() #define pb(x) push_back(x) #define mp(x,y) make_pair(x,y) #define pi pair<int,int> #define f first #define s second int mirror(vector<vector<int>>&a) { int n=a.size(); for (int i=0; i<n; ++i) { for (int j=i+1; j<n; ++j) { if (a[i][j]!=a[j][i]) return 0; } } forn(i,n) if (a[i][i]!=1) return 0; return 1; } int check(vector<vector<int>>&p,vector<int>&one,vector<int>&vis) { if (one.size()<=0) return 1; queue<int> q; forn(i,one.size()) { q.push(one[i]); } //forn(i,p.size()) cout<<vis[i]<<' '; cout<<'\n'; while (!q.empty()) { int v=q.front(); q.pop(); //cout<<"q "<<v<<'\n'; forn(i,p.size()) { if (i==v) continue; if (p[v][i]==1 && vis[i]!=10) return 0; } } forn(i,one.size()) vis[one[i]]=1; return 1; } int bfs(vector<vector<int>>&p, vector<int>&vis, int v, vector<pair<int,int>>&edges) { vector<int> one, two; vector<int> cycle; int n=p.size(); forn(i,n) { if (i==v) continue; if (p[v][i]==1) one.pb(i); else if (p[v][i]==2) two.pb(i); } forn(i,one.size()) vis[one[i]]=10; forn(i,two.size()) vis[two[i]]=10; vis[v]=10; forn(i,one.size()) { forn(j,one.size()) { if (i==j) continue; if (p[one[i]][one[j]]!=1) return 0; } } forn(i,one.size()) edges.pb(mp(v,one[i])); //forn(i,one.size()) vis[one[i]]=1; //forn(i,two.size()) vis[two[i]]=1; //vis[v]=1; if (!two.size()) { //forn(i,one.size()) vis[one[i]]=1; //vis[v]=1; return check(p,one,vis); } else if (two.size()==1) return 0; else { forn(i,one.size()) { forn(j,two.size()) { if (p[one[i]][two[j]]!=2) return 0; } } cycle={v}; forn(i,two.size()) { int foo=1; forn(j,cycle.size()) { if (p[two[i]][cycle[j]]==2) continue; else {foo=0; break;} } if (foo) cycle.pb(two[i]); } } queue<int> q; forn(i,cycle.size()) { if (cycle[i]!=v) q.push(cycle[i]); } while (!q.empty()) { int v=q.front(); q.pop(); vector<int> one, two; forn(i,n) { if (i==v) continue; if (p[v][i]==1) one.pb(i); else if (p[v][i]==2) two.pb(i); } forn(i,one.size()) { forn(j,one.size()) { if (i==j) continue; if (p[one[i]][one[j]]!=1) return 0; } } forn(i,one.size()) edges.pb(mp(v,one[i])); forn(i,one.size()) if (vis[one[i]]!=10) return 0; forn(i,two.size()) if (vis[two[i]]!=10) return 0; if (vis[v]!=10) return 0; if (!two.size()) { continue; } else if (two.size()==1) return 0; else { forn(i,one.size()) { forn(j,two.size()) { if (p[one[i]][two[j]]!=2) return 0; } } } } if (cycle.size()<=2) return 0; forn(i,cycle.size()) { edges.pb(mp(cycle[i],cycle[(i+1)%cycle.size()])); } forn(i,one.size()) vis[one[i]]=1; forn(i,two.size()) vis[two[i]]=1; vis[v]=1; return 1; } int construct(std::vector<std::vector<int>> p) { int n = p.size(); vector<vector<int>> a(n); forn(i,n) a[i].assign(n,0); if (!mirror(p)) return 0; queue<int> q; q.push(0); vector<pair<int,int>> edges; vector<int> vis(n,0); forn(i,n) { if (vis[i]) continue; int x=bfs(p,vis,i,edges); if (x==0) return 0; } for (auto E:edges) { int u=E.f, v=E.s; a[u][v]=1; a[v][u]=1; } build(a); return 1; }

Compilation message (stderr)

supertrees.cpp: In function 'int check(std::vector<std::vector<int> >&, std::vector<int>&, std::vector<int>&)':
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   27 |   forn(i,one.size()) {
      |        ~~~~~~~~~~~~               
supertrees.cpp:27:3: note: in expansion of macro 'forn'
   27 |   forn(i,one.size()) {
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   34 |     forn(i,p.size()) {
      |          ~~~~~~~~~~               
supertrees.cpp:34:5: note: in expansion of macro 'forn'
   34 |     forn(i,p.size()) {
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   39 |   forn(i,one.size()) vis[one[i]]=1;
      |        ~~~~~~~~~~~~               
supertrees.cpp:39:3: note: in expansion of macro 'forn'
   39 |   forn(i,one.size()) vis[one[i]]=1;
      |   ^~~~
supertrees.cpp: In function 'int bfs(std::vector<std::vector<int> >&, std::vector<int>&, int, std::vector<std::pair<int, int> >&)':
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   56 |   forn(i,one.size()) vis[one[i]]=10;
      |        ~~~~~~~~~~~~               
supertrees.cpp:56:3: note: in expansion of macro 'forn'
   56 |   forn(i,one.size()) vis[one[i]]=10;
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   57 |   forn(i,two.size()) vis[two[i]]=10;
      |        ~~~~~~~~~~~~               
supertrees.cpp:57:3: note: in expansion of macro 'forn'
   57 |   forn(i,two.size()) vis[two[i]]=10;
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   60 |   forn(i,one.size()) {
      |        ~~~~~~~~~~~~               
supertrees.cpp:60:3: note: in expansion of macro 'forn'
   60 |   forn(i,one.size()) {
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   61 |     forn(j,one.size()) {
      |          ~~~~~~~~~~~~             
supertrees.cpp:61:5: note: in expansion of macro 'forn'
   61 |     forn(j,one.size()) {
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   66 |   forn(i,one.size()) edges.pb(mp(v,one[i]));
      |        ~~~~~~~~~~~~               
supertrees.cpp:66:3: note: in expansion of macro 'forn'
   66 |   forn(i,one.size()) edges.pb(mp(v,one[i]));
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   78 |     forn(i,one.size()) {
      |          ~~~~~~~~~~~~             
supertrees.cpp:78:5: note: in expansion of macro 'forn'
   78 |     forn(i,one.size()) {
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   79 |       forn(j,two.size()) {
      |            ~~~~~~~~~~~~           
supertrees.cpp:79:7: note: in expansion of macro 'forn'
   79 |       forn(j,two.size()) {
      |       ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   84 |     forn(i,two.size()) {
      |          ~~~~~~~~~~~~             
supertrees.cpp:84:5: note: in expansion of macro 'forn'
   84 |     forn(i,two.size()) {
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   86 |       forn(j,cycle.size()) {
      |            ~~~~~~~~~~~~~~         
supertrees.cpp:86:7: note: in expansion of macro 'forn'
   86 |       forn(j,cycle.size()) {
      |       ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
   95 |   forn(i,cycle.size()) {
      |        ~~~~~~~~~~~~~~             
supertrees.cpp:95:3: note: in expansion of macro 'forn'
   95 |   forn(i,cycle.size()) {
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  111 |     forn(i,one.size()) {
      |          ~~~~~~~~~~~~             
supertrees.cpp:111:5: note: in expansion of macro 'forn'
  111 |     forn(i,one.size()) {
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  112 |       forn(j,one.size()) {
      |            ~~~~~~~~~~~~           
supertrees.cpp:112:7: note: in expansion of macro 'forn'
  112 |       forn(j,one.size()) {
      |       ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  117 |     forn(i,one.size()) edges.pb(mp(v,one[i]));
      |          ~~~~~~~~~~~~             
supertrees.cpp:117:5: note: in expansion of macro 'forn'
  117 |     forn(i,one.size()) edges.pb(mp(v,one[i]));
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  119 |     forn(i,one.size()) if (vis[one[i]]!=10) return 0;
      |          ~~~~~~~~~~~~             
supertrees.cpp:119:5: note: in expansion of macro 'forn'
  119 |     forn(i,one.size()) if (vis[one[i]]!=10) return 0;
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  120 |     forn(i,two.size()) if (vis[two[i]]!=10) return 0;
      |          ~~~~~~~~~~~~             
supertrees.cpp:120:5: note: in expansion of macro 'forn'
  120 |     forn(i,two.size()) if (vis[two[i]]!=10) return 0;
      |     ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  127 |       forn(i,one.size()) {
      |            ~~~~~~~~~~~~           
supertrees.cpp:127:7: note: in expansion of macro 'forn'
  127 |       forn(i,one.size()) {
      |       ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  128 |         forn(j,two.size()) {
      |              ~~~~~~~~~~~~         
supertrees.cpp:128:9: note: in expansion of macro 'forn'
  128 |         forn(j,two.size()) {
      |         ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  138 |   forn(i,cycle.size()) {
      |        ~~~~~~~~~~~~~~             
supertrees.cpp:138:3: note: in expansion of macro 'forn'
  138 |   forn(i,cycle.size()) {
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  142 |   forn(i,one.size()) vis[one[i]]=1;
      |        ~~~~~~~~~~~~               
supertrees.cpp:142:3: note: in expansion of macro 'forn'
  142 |   forn(i,one.size()) vis[one[i]]=1;
      |   ^~~~
supertrees.cpp:4:34: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
    4 | #define forn(i,n) for (int i=0; i<n; ++i)
......
  143 |   forn(i,two.size()) vis[two[i]]=1;
      |        ~~~~~~~~~~~~               
supertrees.cpp:143:3: note: in expansion of macro 'forn'
  143 |   forn(i,two.size()) vis[two[i]]=1;
      |   ^~~~
#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...