Submission #562485

#TimeUsernameProblemLanguageResultExecution timeMemory
562485CaroLindaParachute rings (IOI12_rings)C++14
100 / 100
2184 ms75648 KiB
/*
SUBTASK 1 JUST TO TEST HIPHOTESES
*/

#include <bits/stdc++.h>
 
#define all(x) x.begin(),x.end()
#define sz(x) (int)(x.size())
 
const int MAXN = 1e6+10 ;
 
using namespace std ;
 
int N ;
vector<pair<int,int> > edg ;
int dsu[5][MAXN] , qtd[5][MAXN] , deg[5][MAXN] , qtdCycle[5] , sz_cycle[5] ;
int bigDegree[5] , guy[5] ;
 
int find(int x, int idx){
  return dsu[idx][x] = ( x == dsu[idx][x]) ? x : find(dsu[idx][x],idx) ;
}

int isCycle(int x, int y, int idx ){
  x = find(x,idx) ;
  y = find(y,idx) ;

  if(x == y  )return true ;

  if(rand() % 2) swap(x,y) ;

  dsu[idx][x] = y ;
  qtd[idx][y] += qtd[idx][x] ;

  return false ;
}

void addEdge(int A, int B, int idx){

  if(A == guy[idx] || B == guy[idx]) return ;

  bigDegree[idx] = max(bigDegree[idx],++deg[idx][A]) ;
  bigDegree[idx] = max(bigDegree[idx],++deg[idx][B]) ;

  if(isCycle(A,B,idx)){
    qtdCycle[idx]++ ;
    sz_cycle[idx] = qtd[idx][find(A,idx)] ;
  }

}

void Init(int N_) {
  N = N_;
  guy[0] = -1 ;
  sz_cycle[0] = N ;
  for(int i= 0 ; i < 5 ; i++ )
    for(int j = 0 ; j < N ; j++ ){
      qtd[i][j] = 1 ;
      dsu[i][j] = j ;
    }
}
 
void Link(int A, int B) {
  
  edg.push_back(make_pair(A,B)) ;
  bool spoiled = (bigDegree[0] >= 3) ;
 
  addEdge(A,B,0) ;
  if(spoiled)
    for(int i = 1 ; i < 5 ; i++ ) addEdge(A,B,i) ;

  if(deg[0][A] < deg[0][B]) swap(A,B) ;
  if(bigDegree[0] < 3 || spoiled ) return ;

  guy[1] = A ;
  int id = 1 ;
  for(auto &e : edg ){
    if(e.first == A ) swap(e.first, e.second );
    if(e.second == A) guy[++id] = e.first ;
  }

  for(auto &e : edg )
    for(int i = 1 ;i  < 5 ; i++ )
      addEdge(e.first, e.second , i ) ;
}
 
int CountCritical() {

  int ans = 0 ;
  if(bigDegree[0] < 3 && qtdCycle[0] <= 1){
    ans += sz_cycle[0] ;
  }

  if(bigDegree[0] >= 3 ){
    for(int i = 1 ; i < 5 ; i++ ) 
      ans += (bigDegree[i] < 3 && qtdCycle[i] == 0 ) ;
  }

  return ans ;

}
#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...