답안 #668380

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
668380 2022-12-03T18:04:07 Z 600Mihnea City Mapping (NOI18_citymapping) C++17
88.17 / 100
19 ms 640 KB
#include "citymapping.h"
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

mt19937 rng((long long) (new char));

ll ask(int i, int j)
{
  return get_distance(i + 1, j + 1);
}

void find_roads(int n, int q, int e_a[], int e_b[], int e_w[])
{
  int root = rng() % n;
  vector<ll> dist0(n, 0);
  vector<int> ord;
  for (int i = 0; i < n; i++)
  {
    if (root == i)
    {
      dist0[i] = 0;
      continue;
    }
    dist0[i] = ask(root, i);
    ord.push_back(i);
  }
  sort(ord.begin(), ord.end(), [&] (int i, int j) {return dist0[i] < dist0[j];});
  vector<int> deja = {0};
  vector<vector<int>> g(n);
  vector<int> sub(n), big(n), u(n), par(n);
  int top = 0;

  auto add_edge = [&] (int a, int b)
  {
    e_a[top] = a + 1;
    e_b[top] = b + 1;
    e_w[top] = dist0[b] - dist0[a];
    g[a].push_back(b);
    top++;
  };

  function<void(int)> dfs = [&] (int a)
  {
    sub[a] = 1;
    if (g[a].empty())
    {
      u[a] = a;
      return;
    }
    big[a] = g[a][0];
    for (auto &b : g[a])
    {
      dfs(b);
      par[b] = a;
      sub[a] += sub[b];
      if (sub[b] > sub[big[a]])
      {
        big[a] = b;
      }
    }
    u[a] = u[big[a]];
  };

  function<void(int, int)> locate = [&] (int root, int new_vertex)
  {
    if (sub[root] == 1)
    {
      add_edge(root, new_vertex);
      return;
    }
    int b = u[root];
    ll dist_b_v = ask(b, new_vertex);
    ll dist_b_r = dist0[b] - dist0[root];
    ll dist_v_r = dist0[new_vertex] - dist0[root];
    ll sum_dub = (dist_b_v + dist_b_r + dist_v_r);
    ll sum = sum_dub / 2;
    ll z = sum - dist_b_r;
    ll x = sum - dist_b_v;
    ll y = sum - dist_v_r;
    int fix_inainte = -1;
    if (y == 0)
    {
      add_edge(b, new_vertex);
      return;
    }
    while (y > 0)
    {
      y -= (dist0[b] - dist0[par[b]]);
      fix_inainte = b;
      b = par[b];
    }
    int mid_point = b;
    if (z == 0)
    {
      add_edge(mid_point, new_vertex);
      return;
    }
    if ((int) g[mid_point].size() == 1)
    {
      add_edge(mid_point, new_vertex);
      return;
    }
    vector<int> oth;
    for (auto &vecin : g[mid_point])
    {
      if (vecin == fix_inainte)
      {
        continue;
      }
      oth.push_back(vecin);
    }
    if ((int) oth.size() == 1)
    {
      if (dist0[oth[0]] - dist0[mid_point] >= z)
      {
        add_edge(mid_point, new_vertex);
        return;
      }
      if (ask(oth[0], new_vertex) < z)
      {
        locate(oth[0], new_vertex);
        return;
      }
      add_edge(mid_point, new_vertex);
      return;
    }
    if (ask(oth[0], new_vertex) < ask(oth[1], new_vertex))
    {
      locate(oth[0], new_vertex);
    }
    else
    {
      locate(oth[1], new_vertex);
    }
  };

  for (auto &vertex : ord)
  {
    dfs(root);
    locate(root, vertex);
  }
}

Compilation message

citymapping.cpp: In lambda function:
citymapping.cpp:81:8: warning: unused variable 'x' [-Wunused-variable]
   81 |     ll x = sum - dist_b_v;
      |        ^
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 524 KB Correct: 2317 out of 500000 queries used.
2 Correct 18 ms 528 KB Correct: 3087 out of 500000 queries used.
3 Correct 17 ms 512 KB Correct: 6901 out of 500000 queries used.
4 Correct 14 ms 512 KB Correct: 8769 out of 500000 queries used.
5 Correct 18 ms 520 KB Correct: 4409 out of 500000 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 524 KB Correct: 2317 out of 500000 queries used.
2 Correct 18 ms 528 KB Correct: 3087 out of 500000 queries used.
3 Correct 17 ms 512 KB Correct: 6901 out of 500000 queries used.
4 Correct 14 ms 512 KB Correct: 8769 out of 500000 queries used.
5 Correct 18 ms 520 KB Correct: 4409 out of 500000 queries used.
6 Correct 17 ms 572 KB Correct: 2406 out of 500000 queries used.
7 Correct 18 ms 544 KB Correct: 2562 out of 500000 queries used.
8 Correct 18 ms 508 KB Correct: 6387 out of 500000 queries used.
9 Correct 16 ms 504 KB Correct: 7890 out of 500000 queries used.
10 Correct 18 ms 640 KB Correct: 3913 out of 500000 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 468 KB Correct: 2605 out of 12000 queries used.
2 Correct 17 ms 548 KB Correct: 3388 out of 12000 queries used.
3 Correct 17 ms 568 KB Correct: 2745 out of 12000 queries used.
4 Correct 17 ms 584 KB Correct: 2538 out of 12000 queries used.
5 Correct 17 ms 584 KB Correct: 2816 out of 12000 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 16 ms 468 KB Correct: 2605 out of 12000 queries used.
2 Correct 17 ms 548 KB Correct: 3388 out of 12000 queries used.
3 Correct 17 ms 568 KB Correct: 2745 out of 12000 queries used.
4 Correct 17 ms 584 KB Correct: 2538 out of 12000 queries used.
5 Correct 17 ms 584 KB Correct: 2816 out of 12000 queries used.
6 Correct 14 ms 576 KB Correct: 2494 out of 12000 queries used.
7 Correct 17 ms 468 KB Correct: 2578 out of 12000 queries used.
8 Correct 16 ms 572 KB Correct: 2352 out of 12000 queries used.
9 Correct 17 ms 560 KB Correct: 2844 out of 12000 queries used.
10 Correct 16 ms 488 KB Correct: 2496 out of 12000 queries used.
# 결과 실행 시간 메모리 Grader output
1 Correct 15 ms 524 KB Correct: 2317 out of 500000 queries used.
2 Correct 18 ms 528 KB Correct: 3087 out of 500000 queries used.
3 Correct 17 ms 512 KB Correct: 6901 out of 500000 queries used.
4 Correct 14 ms 512 KB Correct: 8769 out of 500000 queries used.
5 Correct 18 ms 520 KB Correct: 4409 out of 500000 queries used.
6 Correct 17 ms 572 KB Correct: 2406 out of 500000 queries used.
7 Correct 18 ms 544 KB Correct: 2562 out of 500000 queries used.
8 Correct 18 ms 508 KB Correct: 6387 out of 500000 queries used.
9 Correct 16 ms 504 KB Correct: 7890 out of 500000 queries used.
10 Correct 18 ms 640 KB Correct: 3913 out of 500000 queries used.
11 Correct 16 ms 468 KB Correct: 2605 out of 12000 queries used.
12 Correct 17 ms 548 KB Correct: 3388 out of 12000 queries used.
13 Correct 17 ms 568 KB Correct: 2745 out of 12000 queries used.
14 Correct 17 ms 584 KB Correct: 2538 out of 12000 queries used.
15 Correct 17 ms 584 KB Correct: 2816 out of 12000 queries used.
16 Correct 14 ms 576 KB Correct: 2494 out of 12000 queries used.
17 Correct 17 ms 468 KB Correct: 2578 out of 12000 queries used.
18 Correct 16 ms 572 KB Correct: 2352 out of 12000 queries used.
19 Correct 17 ms 560 KB Correct: 2844 out of 12000 queries used.
20 Correct 16 ms 488 KB Correct: 2496 out of 12000 queries used.
21 Correct 16 ms 548 KB Correct: 2872 out of 25000 queries used.
22 Correct 17 ms 536 KB Correct: 2979 out of 25000 queries used.
23 Correct 17 ms 528 KB Correct: 3231 out of 25000 queries used.
24 Correct 19 ms 528 KB Correct: 2910 out of 25000 queries used.
25 Correct 17 ms 500 KB Correct: 6430 out of 25000 queries used.
26 Correct 18 ms 496 KB Correct: 6557 out of 25000 queries used.
27 Correct 16 ms 504 KB Correct: 6208 out of 25000 queries used.
28 Correct 18 ms 468 KB Correct: 6414 out of 25000 queries used.
29 Correct 15 ms 468 KB Correct: 6302 out of 25000 queries used.
30 Correct 16 ms 468 KB Correct: 6636 out of 25000 queries used.
31 Correct 16 ms 512 KB Correct: 7972 out of 25000 queries used.
32 Correct 17 ms 468 KB Correct: 2831 out of 25000 queries used.
33 Correct 16 ms 468 KB Correct: 7881 out of 25000 queries used.
34 Correct 14 ms 504 KB Correct: 7992 out of 25000 queries used.
35 Correct 16 ms 504 KB Correct: 7924 out of 25000 queries used.
36 Correct 16 ms 512 KB Correct: 7947 out of 25000 queries used.
37 Correct 16 ms 468 KB Correct: 7987 out of 25000 queries used.
38 Correct 16 ms 508 KB Correct: 8118 out of 25000 queries used.
39 Correct 16 ms 508 KB Correct: 7933 out of 25000 queries used.
40 Correct 16 ms 596 KB Correct: 8095 out of 25000 queries used.
41 Correct 15 ms 468 KB Correct: 7995 out of 25000 queries used.
42 Correct 16 ms 468 KB Correct: 7957 out of 25000 queries used.
43 Correct 16 ms 600 KB Correct: 2257 out of 25000 queries used.
44 Correct 16 ms 500 KB Correct: 7876 out of 25000 queries used.
45 Correct 13 ms 468 KB Correct: 7891 out of 25000 queries used.
46 Correct 15 ms 504 KB Correct: 7851 out of 25000 queries used.
47 Correct 15 ms 468 KB Correct: 7961 out of 25000 queries used.
48 Correct 16 ms 508 KB Correct: 7938 out of 25000 queries used.
49 Correct 16 ms 508 KB Correct: 8016 out of 25000 queries used.
50 Correct 17 ms 504 KB Correct: 7922 out of 25000 queries used.
51 Correct 15 ms 516 KB Correct: 7930 out of 25000 queries used.
52 Correct 14 ms 504 KB Correct: 7972 out of 25000 queries used.
53 Correct 15 ms 504 KB Correct: 7952 out of 25000 queries used.
54 Correct 16 ms 532 KB Correct: 3195 out of 25000 queries used.
55 Correct 16 ms 468 KB Correct: 7903 out of 25000 queries used.
56 Correct 14 ms 468 KB Correct: 7948 out of 25000 queries used.
57 Correct 16 ms 504 KB Correct: 8013 out of 25000 queries used.
58 Correct 15 ms 500 KB Correct: 7970 out of 25000 queries used.
59 Correct 14 ms 468 KB Correct: 7924 out of 25000 queries used.
60 Correct 18 ms 468 KB Correct: 4650 out of 25000 queries used.
61 Correct 18 ms 632 KB Correct: 4430 out of 25000 queries used.
62 Correct 18 ms 508 KB Correct: 3858 out of 25000 queries used.
63 Correct 16 ms 468 KB Correct: 4295 out of 25000 queries used.
64 Correct 18 ms 512 KB Correct: 4666 out of 25000 queries used.
65 Correct 14 ms 532 KB Correct: 2075 out of 25000 queries used.
66 Correct 18 ms 520 KB Correct: 4339 out of 25000 queries used.
67 Correct 16 ms 532 KB Correct: 2276 out of 25000 queries used.
68 Correct 17 ms 528 KB Correct: 3094 out of 25000 queries used.
69 Correct 17 ms 544 KB Correct: 2440 out of 25000 queries used.
70 Correct 17 ms 548 KB Correct: 2154 out of 25000 queries used.