Submission #1246676

#TimeUsernameProblemLanguageResultExecution timeMemory
1246676CyberCowSphinx's Riddle (IOI24_sphinx)C++20
0 / 100
0 ms424 KiB
#include "sphinx.h"
#include <bits/stdc++.h>
using namespace std;

vector<int> v[300];

int p[300], sz[300];

int p1[300], sz1[300];

int qan = 0;

//
void make_set1(int i)
{
  p1[i] = i;
  sz1[i] = 1;
}

int get_papa1(int i)
{
  if(p1[i] == i)return i;
  return p1[i] = get_papa1(p1[i]);
}

void union_set1(int a, int b)
{
  a = get_papa1(a);
  b = get_papa1(b);
  if(a == b)return;
  if(sz1[a] > sz1[b])swap(a, b);
  p1[a] = b;
  sz1[b] += sz1[a];
}
//

void make_set(int i)
{
  p[i] = i;
  sz[i] = 1;
  qan++;
}

int get_papa(int i)
{
  if(p[i] == i)return i;
  return p[i] = get_papa(p[i]);
}

void union_set(int a, int b)
{
  a = get_papa(a);
  b = get_papa(b);
  if(a == b)return;
  if(sz[a] > sz[b])swap(a, b);
  p[a] = b;
  sz[b] += sz[a];
  qan--;
}

int NN;

vector<int> XX, YY;

int perform_experimentQ(vector<int> &a)
{
  int x = perform_experiment(a); 
  qan = 0;
  for (int i = 0; i < a.size(); i++)
  {
    if(a[i] == NN)
    {
      make_set(i);
    }
  }
  for (int i = 0; i < XX.size(); i++)
  {
    if(a[XX[i]] == NN && a[YY[i]] == NN)
    {
      union_set(XX[i], YY[i]);
    }
  }
  return x - qan;
}

vector<int> find_colours(int N, vector<int> X, vector<int> Y) {
  XX = X;
  YY = Y;
  NN = N;
  // if(N <= 50)
  // {
  //   vector<int> G(N, 0);
  // vector<int> E(N, N);
  // for (int i = 0; i < X.size(); i++)
  // {
  //   v[X[i]].push_back(Y[i]);
  //   v[Y[i]].push_back(X[i]);
  // }
  // for (int i = 0; i < N; i++)
  // {             
  //   E[i] = 0;
  //   E[v[i][0]] = 0;
  //   int x = perform_experiment(E);
  //   for (int j = 0; j < N; j++)
  //   {
  //     E[i] = -1;
  //     E[v[i][0]] = j;
  //     int y = perform_experiment(E);
  //     if(x == y)
  //     {
  //       G[i] = j;
  //       break;;
  //     }
  //   }
  //   E[i] = N;
  //   E[v[i][0]] = N;
  // }
  // return G;
  // }
  vector<int> harc(N, N);
  vector<int> bi;
  for (int i = 0; i < N; i++)
  {
    make_set1(i);
    harc[i] = -1;
    if(i == 0)
    bi.push_back(1);
    else
    bi.push_back(perform_experimentQ(harc));
  }
  int ne = 1;
  vector<int> ans;
  for (int i = 1; i < N; i++)
  {
      int l = 0, r = i - 1, anss = -1;
      while(l <= r)
      {
        int m = (l + r) / 2;
        vector<int> blblb(N, N);
        for (int j = 0; j <= m; j++)
        {
          blblb[j] = -1;
        }
        blblb[i] = -1;
        int x = perform_experimentQ(blblb);
        if(x == bi[m])
        {
          anss= m;
          r = m - 1;
        }
        else
        l = m + 1;
      }
      if(anss != -1)
        union_set1(i, anss);
  }
  for (int i = 0; i < N; i++)
  {
    ans.push_back(get_papa(i));
  }
  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...
#Verdict Execution timeMemoryGrader output
Fetching results...