답안 #850271

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
850271 2023-09-16T09:07:47 Z tvladm2009 철인 이종 경기 (APIO18_duathlon) C++17
0 / 100
134 ms 88764 KB
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = (int)3e5 + 7;
int n;
int m;
vector<int> g[N];
vector<int> g2[N];
int dep[N];
int mindep[N];
vector<vector<int>> all;
vector<pair<int, int>> stk;
int dim;
int inside[N];

void dfs(int a) {
  mindep[a] = dep[a];

  for (auto &b : g[a]) {
    if (dep[b] == -1) {
      dep[b] = dep[a] + 1;
      stk.push_back({a, b});
      dfs(b);
      mindep[a] = min(mindep[a], mindep[b]);
      if (mindep[b] >= dep[a]) {
        vector<int> cur;
        while (1) {
          auto it = stk.back();
          cur.push_back(it.first);
          cur.push_back(it.second);
          stk.pop_back();
          if (it == make_pair(a, b)) {
            break;
          }
        }
        sort(cur.begin(), cur.end());
        cur.resize(unique(cur.begin(), cur.end()) - cur.begin());
        all.push_back(cur);

        dim++;
        for (auto &v : cur) {
          inside[dim]++;
          g2[v].push_back(dim);
          g2[dim].push_back(v);
        }
      }
    } else {
      if (dep[b] < dep[a] - 1) {
        mindep[a] = min(mindep[a], dep[b]);
      }
    }
  }
}

int sub[N];
int ninit;
int total = 0;

ll sol = 0;

void solve(int a) {
  sub[a] = (a <= ninit);
  vector<int> kids;
  for (auto &b : g[a]) {
    if (sub[b] == -1) {
      solve(b);
      sub[a] += sub[b];
      kids.push_back(b);
    }
  }
  g[a] = kids;
}

int solve2(int a, int p = -1) {
  for (auto &b : g[a]) {
    solve2(b, a);
    if (a > ninit) {
      sol -= 1LL * (inside[a] - 1) * sub[b] * (sub[b] - 1);
    }
  }
  if (a > ninit) {
    sol -= 1LL * (inside[a] - 1) * (total - sub[a]) * (total - sub[a] - 1);
  }
}

int main() {
  ios::sync_with_stdio(0); cin.tie(0); cout.tie(0);

///  freopen ("input.txt", "r", stdin);

  cin >> n >> m;
  for (int i = 1; i <= m; i++) {
    int a, b;
    cin >> a >> b;
    g[a].push_back(b);
    g[b].push_back(a);
    sub[a] = -1;
  }
  for (int i = 1; i <= n; i++) {
    dep[i] = -1;
  }
  ninit = n;
  dim = n;
  for (int i = 1; i <= n; i++) {
    if (dep[i] == -1) {
      dep[i] = 0;
      dfs(i);
    }
  }

  n = dim;
  for (int i = 1; i <= n; i++) {
    g[i] = g2[i];
    sub[i] = -1;
  }

  for (int i = 1; i <= n; i++) {
    if (sub[i] == -1) {
      solve(i);
      total = sub[i];
      sol += 1LL * total * (total - 1) * (total - 2);
      solve2(i);
    }
  }
  cout << sol << "\n";
  return 0;
}

Compilation message

count_triplets.cpp: In function 'int solve2(int, int)':
count_triplets.cpp:87:1: warning: no return statement in function returning non-void [-Wreturn-type]
   87 | }
      | ^
# 결과 실행 시간 메모리 Grader output
1 Runtime error 21 ms 38492 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 21 ms 38492 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 106 ms 88764 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 17 ms 38492 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 134 ms 75624 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 24 ms 38748 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 110 ms 75640 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 21 ms 38492 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Runtime error 21 ms 38492 KB Execution killed with signal 11
2 Halted 0 ms 0 KB -