Submission #1318633

#TimeUsernameProblemLanguageResultExecution timeMemory
1318633TraianDanciuEaster Eggs (info1cup17_eastereggs)C++20
66 / 100
10 ms488 KiB
#include <vector>
#include <iostream>
#include "grader.h"

using namespace std;

const int MAXN = 512;

vector<int> g[MAXN + 1], toquery;
vector<vector<int>> subtrees;
int viz[MAXN + 1], sz[MAXN + 1], answer;

void dfsSize(int node, int parent) {
  sz[node] = 1;
  for(int son : g[node]) {
    if(!viz[son] && son != parent) {
      dfsSize(son, node);
      sz[node] += sz[son];
    }
  }
}

int findCentroid(int node, int limit) {
  for(int son : g[node]) {
    if(!viz[son] && sz[son] < sz[node] && sz[son] > limit) {
      return findCentroid(son, limit);
    }
  }
  return node;
}

void dfs(int node, int parent) {
  subtrees.back().push_back(node);
  for(int son : g[node]) {
    if(!viz[son] && son != parent) {
      dfs(son, node);
    }
  }
}

void decompose(int node) {
  dfsSize(node, 0);
  node = findCentroid(node, sz[node] / 2);

  subtrees = {{node}};
  for(int son : g[node]) {
    if(!viz[son]) {
      subtrees.push_back({});
      dfs(son, node);
    }
  }

  int st = 0, dr = (int)subtrees.size() - 1, poz = 0;
  while(st <= dr) {
    int mij = (st + dr) / 2;
    toquery.clear();
    for(int i = 0; i <= mij; i++) {
      for(int node : subtrees[i]) {
        toquery.push_back(node);
      }
    }
    if(query(toquery)) {
      poz = mij;
      dr = mij - 1;
    } else {
      st = mij + 1;
    }
  }

  if(poz == 0) {
    answer = node;
    return;
  }

  viz[node] = 1;
  int cnt = 0;
  for(int son : g[node]) {
    if(!viz[son]) {
      cnt++;
      if(cnt == poz) {
        decompose(son);
        return;
      }
    }
  }
}

int findEgg(int n, vector<pair<int, int>> edges) {
  for(int i = 1; i <= n; i++) {
    g[i].clear();
    viz[i] = 0;
  }

  for(int i = 0; i < n - 1; i++) {
    g[edges[i].first].push_back(edges[i].second);
    g[edges[i].second].push_back(edges[i].first);
  }

  decompose(1);
  return answer;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...