Submission #1244721

#TimeUsernameProblemLanguageResultExecution timeMemory
1244721repmannICC (CEOI16_icc)C++20
90 / 100
1773 ms636 KiB
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
bool D[101], VG[101][101];
struct NODE
{
  int parent, num;
  vector <int> V;
}DSU[101];
//inline bool query(int size_a, int size_b, int a[], int b[])
//{
//  cout << "Query:\n";
//  cout << size_a << '\n';
//  for(int i = 0; i < size_a; i++) cout << a[i] << " \n"[i == (size_a - 1)];
//  cout << size_b << '\n';
//  for(int i = 0; i < size_b; i++) cout << b[i] << " \n"[i == (size_b - 1)];
//  bool ans;
//  cin >> ans;
//  return ans;
//}
//inline void setRoad(int u, int v)
//{
//  cout << "Set: " << u << ' ' << v << '\n';
//  return;
//}
inline int Find(int u)
{
  if(u != DSU[u].parent) return Find(DSU[u].parent);
  return u;
}
inline void Union(int u, int v)
{
  u = Find(u);
  v = Find(v);
  if(u == v) return;
  if(DSU[u].num < DSU[v].num) swap(u, v);
  DSU[v].parent = u;
  DSU[u].num += DSU[v].num;
  for(int x : DSU[v].V) DSU[u].V.push_back(x);
  DSU[v].V = vector <int>();
  return;
}
inline int BS(int size_a, int size_b, int a[], int b[])
{
  int L = 0, R = size_a - 1, S, temp[size_a];
  while(L < R)
  {
    S = (L + R) >> 1;
    for(int i = L, j = 0; i <= S; i++) temp[j++] = a[i];
    if(!query(S - L + 1, size_b, temp, b)) L = S + 1;
    else R = S;
  }
  return a[R];
}
void run(int N)
{
  for(int i = 1; i <= N; i++) DSU[i] = {i, 1, {i}};
  int edges = N - 1;
  while(edges--)
  {
    int num, u, v, a[N], b[N];
    memset(VG, 0, sizeof(VG));
    do
    {
      int iterations = 200, temp, best = 0;
      memset(D, 0, sizeof(D));
      vector <int> V, VCPY;
      for(int i = 1, j; i <= N; i++)
      {
        j = Find(i);
        if(D[j]) continue;
        D[j] = true;
        V.push_back(j);
      }
      while(iterations--)
      {
        random_shuffle(V.begin(), V.end());
        num = 0, temp = 0;
        for(int i = 0; i < V.size(); i++)
        {
          num += DSU[V[i]].num;
          for(int x : DSU[V[i]].V)
          {
            for(int j = 0; j < i; j++)
            {
              for(int y : DSU[V[j]].V) temp -= VG[x][y];
            }
            for(int j = i + 1; j < V.size(); j++)
            {
              for(int y : DSU[V[j]].V) temp += VG[x][y];
            }
          }
          if((num * (N - num) - temp) <= best) continue;
          best = num * (N - num) - temp;
          VCPY = vector <int>();
          for(int j = 0; j <= i; j++) VCPY.push_back(V[j]);
        }
      }
      for(int i = 0; i < VCPY.size(); i++)
      {
        for(int x : DSU[VCPY[i]].V)
        {
          for(int j = 0; j < V.size(); j++)
          {
            bool flag = false;
            for(int y : VCPY) if(V[j] == y) {flag = true; break;}
            if(flag) continue;
            for(int y : DSU[V[j]].V) VG[x][y] = VG[y][x] = 1;
          }
        }
      }
      memset(D, 0, sizeof(D));
      num = 0;
      for(int x : VCPY)
      {
        num += DSU[x].num;
        for(int y : DSU[x].V) D[y] = 1;
      }
      for(int i = 1, j = 0; i <= N; i++) if(D[i]) a[j++] = i;
      for(int i = 1, j = 0; i <= N; i++) if(!D[i]) b[j++] = i;
    }while(!query(num, N - num, a, b));
    a[0] = u = BS(num, N - num, a, b);
    v = BS(N - num, 1, b, a);
    Union(u, v);
    setRoad(u, v);
  }
  return;
}
//int main()
//{
//  int n;
//  cin >> n;
//  run(n);
//
//  return 0;
//}
#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...