Submission #1244770

#TimeUsernameProblemLanguageResultExecution timeMemory
1244770repmannICC (CEOI16_icc)C++20
0 / 100
93 ms584 KiB
#include <bits/stdc++.h>
#include "icc.h"
using namespace std;
bool D[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 bit = 0, num, u, v, a[N], b[N];
    memset(D, 0, sizeof(D));
    for(int i = 1; i <= N; i++) D[Find(i)] = 1;
    do
    {
      num = 0;
      for(int i = 1, j = 0; i <= N; i++)
      {
        if(!D[i]) continue;
        bool flag = 0;
        for(int x : DSU[i].V) flag |= bool(x & (1 << bit));
        if(!flag) continue;
        num += DSU[i].num;
        for(int x : DSU[i].V) a[j++] = x;
      }
      for(int i = 1, j = 0; i <= N; i++)
      {
        b[j++] = i;
        for(int k = 0; k < num; k++) if(a[k] == i) {j--; break;}
      }
      bit++;
      if(num == N) continue;
    }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...