Submission #653123

#TimeUsernameProblemLanguageResultExecution timeMemory
653123LitusianoConnecting Supertrees (IOI20_supertrees)C++14
0 / 100
1 ms300 KiB
#include "supertrees.h"
#include <vector>
#include <cassert>
#include <cstdio>
#include <cstdlib>
#include <string>
#include<bits/stdc++.h>
using namespace std;
 
 
#define f first
#define s second
#define ii pair<int,int>
#define vi vector<int>
#define vvi vector<vi>
#define vvii vector<vector<ii>>
#define pb push_back
#define vpi vector<ii> 
#define forcin for(int i = 0; i<n; ++i) cin>>v[i];
#define pq priority_queue<ii>
#define mp make_pair
#define ld long double
#define vc vector<char>
#define vvc vector<vc>
#define vb vector<bool>
#define vvb vector<vb>
#define all(a) (a).begin(),(a).end()
#define rall(a) (a).rbegin(),(a).rend()
#define For(i, n, x) for (int i = x; i < n; i++)
#define rsz(a,x) assign(a,x)
#define endl "\n"
int construct(vvi p){
  // Cap cami, components diferents
  // tots == 1, graf lineal
  // tots == 2, graf lineal amb el ultim unit al primer
  int N = p.size();
  vvi used(N,vi(N,0));
  vpi edges;
  /*For(i,N,0){
    For(j,N,0) cout<<p[i][j]<<" "; cout<<endl;
  }*/
  For(i,N,0){
    For(j,N,0){
      if(used[i][j] || i == j) continue;
      //cout<<p[i][j]<<" "<<j<<endl;
      if(p[i][j] == 0) continue;
      //cout<<i<<" "<<j<<endl;
      // si tinc 1, vaig buscant 1ns sino dosos
      int cur = j;
      set<int> act;
      edges.pb({i,j});
      if(p[i][j] == 1) act.insert(i);
      used[i][j] = used[j][i] = 1;
      // Miro TOT EL CICLE
      while(!act.count(cur)){
        act.insert(j);
        bool b = false;
        For(k,N,0){
          if(act.count(k) && cur != k){
            //cout<<"HERE"<<endl;
            if(p[k][cur] != p[cur][k] || p[cur][k] != p[i][j]){
              //cout<<"HERE "<<cur<<" "<<k<<" "<<i<<" "<<j<<" "<<p[i][j]<<" "<<p[cur][k]<<endl;
              return 0;
            }
          }
          if(!act.count(k) && p[cur][k] == p[i][j] && !b){
            act.insert(k);
            b = 1;
            //afegir edge
            edges.pb({k,cur});
            used[cur][k] = 1;
            used[k][cur] = 1;
            cur = k;
          }
        }
      }
    }
  }
  //cout<<"AAAAA"<<endl;
  //cerr<<edges.size()<<endl;
  vvi ans(N,vi(N,0));
  for(auto x : edges){
    if(ans[x.f][x.s]) return 0;
    ans[x.f][x.s] = ans[x.s][x.f] = 1;
  }
  build(ans);
  return 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...