Submission #457578

#TimeUsernameProblemLanguageResultExecution timeMemory
457578vectorConnecting Supertrees (IOI20_supertrees)C++17
100 / 100
277 ms24132 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
#define SIZE 1001
using namespace std;
int root[SIZE], a[SIZE];
vector<vector<int> > con;
vector<vector<vector<int> > > lin;
int Find(int x)
{
    if (x==root[x]) return x;
    return root[x]=Find(root[x]);
}
void Union(int x, int y)
{
    if (Find(x)==Find(y)) return;
    root[root[x]]=root[y];
}
int construct(vector<vector<int> > p)
{
	int N=p.size(), M;
	vector<vector<int> > ret(N);
	for (int i=0; i<N; i++) {
        ret[i].resize(N);
        root[i]=i, a[i]=-1;
	}
	for (int i=0; i<N; i++) for (int j=0; j<N; j++) if (i!=j) {
        if (p[i][j]==3) return 0;
        if (p[i][j]!=0) Union(i, j);
	}
	for (int i=0; i<N; i++) {
        if (a[Find(i)]==-1) {
            a[root[i]]=con.size();
            vector<int> v;
            v.push_back(i);
            con.push_back(v);
        }
        else con[a[root[i]]].push_back(i);
	}
	M=con.size();
	lin.resize(M);
	for (int i=0; i<M; i++) for (int j : con[i]) for (int k : con[i]) if (p[j][k]==0) return 0;
	for (int i=0; i<N; i++) root[i]=i, a[i]=-1;
	for (int i=0; i<M; i++) {
        for (int j : con[i]) for (int k : con[i]) if (j!=k && p[j][k]==1) Union(j, k);
        for (int j : con[i]) {
            if (a[Find(j)]==-1) {
                a[root[j]]=lin[i].size();
                vector<int> v;
                v.push_back(j);
                lin[i].push_back(v);
            }
            else lin[i][a[root[j]]].push_back(j);
        }
        if (lin[i].size()==2) return 0;
        for (int j=0; j<lin[i].size(); j++) for (int k : lin[i][j]) for (int l : lin[i][j]) if (p[k][l]==2) return 0;
        for (int j=0; j<lin[i].size(); j++) for (int k=0; k<lin[i][j].size(); k++) {
            if (k!=0) ret[lin[i][j][k]][lin[i][j][k-1]]=1;
            if (k!=lin[i][j].size()-1) ret[lin[i][j][k]][lin[i][j][k+1]]=1;
        }
        for (int j=0; j<lin[i].size()-1; j++) ret[lin[i][j][0]][lin[i][j+1][0]]=ret[lin[i][j+1][0]][lin[i][j][0]]=1;
        if (lin[i].size()>1) {
            ret[lin[i][lin[i].size()-1][0]][lin[i][0][0]]=1;
            ret[lin[i][0][0]][lin[i][lin[i].size()-1][0]]=1;
        }
	}
	build(ret);
	return 1;
}

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:55:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   55 |         for (int j=0; j<lin[i].size(); j++) for (int k : lin[i][j]) for (int l : lin[i][j]) if (p[k][l]==2) return 0;
      |                       ~^~~~~~~~~~~~~~
supertrees.cpp:56:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for (int j=0; j<lin[i].size(); j++) for (int k=0; k<lin[i][j].size(); k++) {
      |                       ~^~~~~~~~~~~~~~
supertrees.cpp:56:60: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   56 |         for (int j=0; j<lin[i].size(); j++) for (int k=0; k<lin[i][j].size(); k++) {
      |                                                           ~^~~~~~~~~~~~~~~~~
supertrees.cpp:58:18: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   58 |             if (k!=lin[i][j].size()-1) ret[lin[i][j][k]][lin[i][j][k+1]]=1;
      |                 ~^~~~~~~~~~~~~~~~~~~~
supertrees.cpp:60:24: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<std::vector<int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   60 |         for (int j=0; j<lin[i].size()-1; j++) ret[lin[i][j][0]][lin[i][j+1][0]]=ret[lin[i][j+1][0]][lin[i][j][0]]=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...