Submission #41925

# Submission time Handle Problem Language Result Execution time Memory
41925 2018-02-22T06:07:44 Z funcsr Towns (IOI15_towns) C++14
26 / 100
345 ms 5832 KB
#include "towns.h"
#include <vector>
#include <iostream>
#include <algorithm>
#include <queue>
#include <cassert>
#include <set>
using namespace std;
typedef pair<int, int> P;
#define rep(i, n) for (int i=0; i<(n); i++)
#define pb push_back
#define _1 first
#define _2 second
#define INF 1145141919
#define MOD 1000000007
#define all(x) x.begin(), x.end()
#define uniq(x) x.erase(unique(all(x)), x.end())

//#define MAX_V 300
#define MAX_V 1000
int dist[MAX_V][MAX_V];
vector<P> G[MAX_V];

int dfs(int x, int p, int r) {
  int ret = r;
  for (P pp : G[x]) if (pp._1 != p) {
    int t = pp._1, len = pp._2;
    ret = max(ret, dfs(t, x, r+len));
  }
  return ret;
}
int dfs2(int x, int p) {
  int s = G[x].size() == 1;
  for (P pp : G[x]) if (pp._1 != p) {
    int t = pp._1;
    s += dfs2(t, x);
  }
  return s;
}

int hubDistance(int N, int sub) {
  rep(i, MAX_V) rep(j, MAX_V) dist[i][j] = 0;
  rep(i, MAX_V) G[i].clear();
  rep(i, N) rep(j, i) dist[i][j] = dist[j][i] = getDistance(i, j);
  set<int> nokori;
  rep(i, N) nokori.insert(i);
  int V = N;

  while (nokori.size() >= 2) {
    bool ok = false;
    for (int u : nokori) {
      vector<int> rs;
      rs.pb(u);
      for (int v : nokori) if (u != v) {
        vector<int> vs;
        for (int x : nokori) if (x != u && x != v) vs.pb(dist[x][u]-dist[x][v]);
        bool same = true;
        for (int x : vs) if (x != vs[0]) same = false;
        if (same) rs.pb(v);
      }
      if (rs.size() < 2) continue;
      ok = true;
      //cout<<"{";for (int x : rs)cout<<x<<",";cout<<"}\n";
      int x0 = rs[0], x1 = rs[1];
      for (int x : rs) nokori.erase(x);
      if (nokori.empty()) assert(rs.size() >= 3);
      int tekitou = -1;
      if (nokori.empty()) tekitou = rs[2];
      else tekitou = *nokori.begin();
      int sum = dist[x0][x1], diff = dist[x0][tekitou] - dist[x1][tekitou];
      int a = (sum+diff)/2;
      int root = V++;
      G[root].pb(P(x0, a));
      G[x0].pb(P(root, a));
      for (int x : rs) if (x != x0) {
        int d = dist[x0][x] - a;
        G[root].pb(P(x, d));
        G[x].pb(P(root, d));
      }
      for (int x : nokori) dist[root][x] = dist[x][root] = dist[x0][x] - a;
      nokori.insert(root);
      break;
    }
    if (!ok) abort();
  }
  assert(V <= MAX_V);
  rep(i, N) assert(G[i].size() == 1);
  rep(i, V) if (i >= N) assert(G[i].size() >= 3);
  int R = INF;
  rep(i, V) R = min(R, dfs(i, -1, 0));
  bool ex = false;
  rep(i, V) if (dfs(i, -1, 0) == R) {
    bool ok = true;
    for (P pp : G[i]) {
      int t = pp._1;
      if (dfs2(t, i) > (N/2)) ok = false;
    }
    if (ok) {
      ex = true;
      break;
    }
  }
  if (ex) return R;
  else return -R;
}

Compilation message

towns.cpp:41:28: warning: unused parameter 'sub' [-Wunused-parameter]
 int hubDistance(int N, int sub) {
                            ^
# Verdict Execution time Memory Grader output
1 Correct 345 ms 4344 KB Output is correct
2 Correct 112 ms 4344 KB Output is correct
3 Correct 4 ms 4372 KB Output is correct
4 Correct 44 ms 4532 KB Output is correct
5 Correct 42 ms 4532 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 4532 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 116 ms 4580 KB Output is correct
2 Correct 45 ms 5092 KB Output is correct
3 Correct 5 ms 5108 KB Output is correct
4 Correct 43 ms 5832 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 4 ms 5832 KB Output isn't correct
# Verdict Execution time Memory Grader output
1 Incorrect 8 ms 5832 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 5 ms 5832 KB Output isn't correct
2 Halted 0 ms 0 KB -