Submission #255928

# Submission time Handle Problem Language Result Execution time Memory
255928 2020-08-02T05:55:23 Z KoD Duathlon (APIO18_duathlon) C++17
8 / 100
155 ms 7164 KB
#line 1 "main.cpp"

/**
 * @title Template
 */

#include <iostream>
#include <algorithm>
#include <utility>
#include <numeric>
#include <vector>
#include <array>
#include <queue>

#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/chmin_chmax.cpp"

template <class T, class U>
constexpr bool chmin(T &lhs, const U &rhs) {
  if (lhs > rhs) { 
    lhs = rhs; 
    return true; 
  }
  return false;
}

template <class T, class U>
constexpr bool chmax(T &lhs, const U &rhs) {
  if (lhs < rhs) { 
    lhs = rhs; 
    return true; 
  }
  return false;
}

/**
 * @title Chmin/Chmax
 */
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/range.cpp"

#line 4 "/Users/kodamankod/Desktop/Programming/Library/other/range.cpp"

class range {
public:
  class iterator {
  private:
    int64_t M_position;

  public:
    constexpr iterator(int64_t position) noexcept: M_position(position) { }
    constexpr void operator ++ () noexcept { ++M_position; }
    constexpr bool operator != (iterator other) const noexcept { return M_position != other.M_position; }
    constexpr int64_t operator * () const noexcept { return M_position; }

  };

  class reverse_iterator {
  private:
    int64_t M_position;
  
  public:
    constexpr reverse_iterator(int64_t position) noexcept: M_position(position) { }
    constexpr void operator ++ () noexcept { --M_position; }
    constexpr bool operator != (reverse_iterator other) const noexcept { return M_position != other.M_position; }
    constexpr int64_t operator * () const noexcept { return M_position; }

  };
  
private:
  const iterator M_first, M_last;

public:
  constexpr range(int64_t first, int64_t last) noexcept: M_first(first), M_last(std::max(first, last)) { }
  constexpr iterator begin() const noexcept { return M_first; }
  constexpr iterator end() const noexcept { return M_last; }
  constexpr reverse_iterator rbegin() const noexcept { return reverse_iterator(*M_last - 1); } 
  constexpr reverse_iterator rend() const noexcept { return reverse_iterator(*M_first - 1); } 

};

/**
 * @title Range
 */
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/rev.cpp"

#include <type_traits>
#include <iterator>
#line 6 "/Users/kodamankod/Desktop/Programming/Library/other/rev.cpp"

template <class T>
class rev_impl {
public:
  using iterator = typename std::decay<T>::type::reverse_iterator;

private:
  const iterator M_begin;
  const iterator M_end;

public:
  constexpr rev_impl(T &&cont) noexcept: M_begin(std::rbegin(cont)), M_end(std::rend(cont)) { }
  constexpr iterator begin() const noexcept { return M_begin; }
  constexpr iterator end() const noexcept { return M_end; }

};

template <class T>
constexpr decltype(auto) rev(T &&cont) {
  return rev_impl<T>(std::forward<T>(cont));
}

/**
 * @title Reverser
 */
#line 2 "/Users/kodamankod/Desktop/Programming/Library/other/fix_point.cpp"

#line 4 "/Users/kodamankod/Desktop/Programming/Library/other/fix_point.cpp"

template <class Func>
struct fix_point: private Func {
  explicit constexpr fix_point(Func &&func): Func(std::forward<Func>(func)) { }
  template <class... Args>
  constexpr decltype(auto) operator () (Args &&... args) const {
    return Func::operator()(*this, std::forward<Args>(args)...);
  }
};

template <class Func>
constexpr decltype(auto) make_fix_point(Func &&func) {
  return fix_point<Func>(std::forward<Func>(func));
}

/**
 * @title Lambda Recursion
 */
#line 18 "main.cpp"

using i32 = int32_t;
using i64 = int64_t;
using u32 = uint32_t;
using u64 = uint64_t;

constexpr i32 inf32 = (i32(1) << 30) - 1;
constexpr i64 inf64 = (i64(1) << 62) - 1;

int main() {
  i32 N, M;
  std::cin >> N >> M;
  std::vector<std::vector<i32>> graph(N);
  for (auto i: range(0, M)) {
    i32 u, v;
    std::cin >> u >> v;
    --u; --v;
    graph[u].push_back(v);
    graph[v].push_back(u);
  }
  /* 
  std::vector<std::vector<i32>> count(N);
  for (auto i: range(0, N)) {
    count[i].resize(graph[i].size());
  }
  std::vector<bool> visited(N);
  i64 ans = 0;
  for (auto root: range(0, N)) {
    if (visited[root]) {
      continue;
    }
    i32 size = fix_point([&](auto dfs, i32 u) -> i32 {
      visited[u] = true;
      i32 res = 1;
      for (auto i: range(0, graph[u].size())) {
        i32 v = graph[u][i];
        if (visited[v]) {
          continue;
        }
        count[u][i] = dfs(v);
        res += count[u][i];
      }
      return res;
    })(root);
    fix_point([&](auto dfs, i32 u, i32 up) -> void {
      for (auto i: range(0, graph[u].size())) {
        if (count[u][i] == 0) {
          count[u][i] = up;
        }
        else {
          dfs(graph[u][i], size - count[u][i]);
        }
      }
      for (auto x: count[u]) {
        ans += (i64) x * (size - x - 1);
      }
    })(root, 0);
  }
  std::cout << ans << '\n';
  // */
  i64 ans = 0;
  std::vector<bool> visited(N);
  for (auto u: range(0, N)) {
    if (visited[u]) {
      continue;
    }
    visited[u] = true;
    std::queue<i32> queue;
    queue.push(u);
    i32 n = 0, m = 0;
    while (!queue.empty()) {
      i32 v = queue.front();
      queue.pop();
      ++n;
      m += graph[v].size();
      for (auto w: graph[v]) {
        if (!visited[w]) {
          visited[w] = true;
          queue.push(w);
        }
      }
    }
    m /= 2;
    if (n == m) {
      ans += (i64) n * (n - 1) * (n - 2);
    }
    else {
      ans += (i64) n * (n - 1) * (n - 2) / 3;
    }
  }
  std::cout << ans << '\n';
  return 0;
}

Compilation message

main.cpp: In function 'int main()':
main.cpp:31:13: warning: unused variable 'i' [-Wunused-variable]
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Correct 154 ms 5992 KB Output is correct
2 Correct 134 ms 7164 KB Output is correct
3 Correct 149 ms 7032 KB Output is correct
4 Correct 139 ms 7036 KB Output is correct
5 Correct 152 ms 7032 KB Output is correct
6 Correct 127 ms 7032 KB Output is correct
7 Correct 144 ms 7032 KB Output is correct
8 Correct 146 ms 7032 KB Output is correct
9 Correct 130 ms 7032 KB Output is correct
10 Correct 155 ms 7032 KB Output is correct
11 Correct 111 ms 6776 KB Output is correct
12 Correct 114 ms 6648 KB Output is correct
13 Correct 155 ms 6648 KB Output is correct
14 Correct 99 ms 6520 KB Output is correct
15 Correct 74 ms 5880 KB Output is correct
16 Correct 115 ms 5880 KB Output is correct
17 Correct 15 ms 2688 KB Output is correct
18 Correct 15 ms 2688 KB Output is correct
19 Correct 11 ms 2688 KB Output is correct
20 Correct 15 ms 2656 KB Output is correct
21 Correct 11 ms 2688 KB Output is correct
22 Correct 15 ms 2688 KB Output is correct
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 147 ms 6116 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 2 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 137 ms 6136 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -
# Verdict Execution time Memory Grader output
1 Incorrect 1 ms 256 KB Output isn't correct
2 Halted 0 ms 0 KB -