Submission #348899

#TimeUsernameProblemLanguageResultExecution timeMemory
348899evnConnecting Supertrees (IOI20_supertrees)C++14
Compilation error
0 ms0 KiB
#include "supertrees.h"
#include <bits/stdc++.h>
using namespace std;
#define f first
#define s second
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef pair<int, int> pii;
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
template<class T> using oset=tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

int N;
vector<int> dsu;
vector<int> sz;
int find(int u){
	if(dsu[u] == u)return u;
	return dsu[u] = find(dsu[u]);
}
void merge(int u, int v){
	u = find(u);
	v = find(v);
	if(u == v)return;
	if(sz[u] < sz[v])swap(u,v);
	dsu[v] = u;
	sz[u] += sz[v];
}
int construct(vector<vector<int>> p){
	N = p.size();
	dsu.resize(N);
	sz.resize(N);
	assert(N <= 1000);
	bool c0 = false;
	bool c1 = false;
	bool c2 = false;
	bool c3 = false;
	for(int i = 0; i < N; i++){
		for(int j = 0;j  < N; j++){
			if(p[i][j] == 0)c0 = true;
			if(p[i][j] == 1)c1 = true;
			if(p[i][j] == 2)c2 = true;
			if(p[i][j] == 3)c3 = true;
		}
	}
	if(!c0 && c1 && !c2 && !c3){
		//tree case
		vector<vector<int>> b;
		for(int i = 0; i < N;i ++){
			int c1 = 2*i + 1;
			int c2 = 2*i + 2;
			int p = (i-1)/2;
			if(i == 0)p =-1;
			vector<int> curr;
			for(int j = 0;j  < N; j++){
				if(j == p || j == c1 || j== c2){
					curr.pb(1);
				}
				else{
					curr.pb(0);
				}
			}
			b.pb(curr);
		}
		build(b);
		return 1;
	}
	else if(c1 && c2){
		//subtask 4/5
		vector<vector<int>> edges(N);
		int prev[N];
		memset(prev, -1, sizeof(prev));
		for(int i =0;i < N;i ++){
			dsu[i] = i;
			sz[i] = 1;
			edges[i].resize(N);
		}
		for(int i =0;i < N;i ++){
			for(int j = 0;j < N; j++){
				if(p[i][j] == 1){
					//same branch
					merge(i, j);
				}				
			}
		}
		set<int> parents;
		for(int i = 0; i < N;i ++){
			parents.insert(find(i));
		}
		vector<int> p;
		for(int u : parents)p.pb(u);
		for(int i = 1; i < p.size(); i++){
			edges[p[i]][p[i-1]] = 1;
			edges[p[i-1]][p[i]] = 1;
		}
		for(int i= 0;i < N; i++){
			if(prev[find(i)] != -1){
				edges[prev[find(i)]][i] = 1;
				edges[i][prev[find(i)]] = 1;
			}
			prev[find(i)] = i;
		}
		return edges;
	}
	else if(c3){
		//subtask 6
		return 0;		
	}
	else{
		//subtask 2/3
		//do dsu
		for(int i = 0;i  < N; i++){
			dsu[i] = i;
			sz[i] = 1;
		}
		for(int i = 0; i < N;i ++){
			for(int j = 0;j < N; j++){
				if(p[i][j] == 0){
					if(find(i) == find(j)){
						//not possible
						//assert(false);
						return 0;
					}
				}
				else{
					merge(i, j);
				}
			}
		}
		for(int i = 0; i < N;i ++){
			assert(find(i) < N && find(i) >= 0); 
			int g = 0;
			for(int j = 0;j  < N;j ++){
				g = max(g, p[i][j]);
			}
			if(sz[find(i)] <= g && sz[find(i)] != 1)return 0;
		}
		
			//subtask 2
			//make a line 
		vector<vector<int>> edges(N);
		for(int i = 0; i < N;i ++){
			edges[i].resize(N);
		}
		int prev[N];
		int f[N];
		memset(f, -1, sizeof(f));
		memset(prev, -1, sizeof(prev));
		for(int i = 0; i < N;i ++){
			int cmp = find(i);
			if(prev[cmp] != -1){	
				edges[prev[cmp]][i] = 1;
				edges[i][prev[cmp]] = 1;
			}
			if(f[cmp] == -1){
				f[cmp] = i;
			}
			prev[cmp] = i;
		}
		if(c2){
			for(int i = 0; i < N;i ++){
				if(prev[i] != -1 && prev[i] != f[i]){
					edges[prev[i]][f[i]] = 1;
					edges[f[i]][prev[i]] = 1;
				}
			}
		}
		build(edges);
		return 1;
	}
	
	return 0;
}

Compilation message (stderr)

supertrees.cpp: In function 'int construct(std::vector<std::vector<int> >)':
supertrees.cpp:93:20: warning: comparison of integer expressions of different signedness: 'int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   93 |   for(int i = 1; i < p.size(); i++){
      |                  ~~^~~~~~~~~~
supertrees.cpp:104:10: error: cannot convert 'std::vector<std::vector<int> >' to 'int' in return
  104 |   return edges;
      |          ^~~~~