제출 #950290

#제출 시각아이디문제언어결과실행 시간메모리
950290abczz철인 이종 경기 (APIO18_duathlon)C++14
31 / 100
222 ms36428 KiB
#include <iostream>
#include <vector>
#include <algorithm>
#include <array>
#include <deque>
#include <queue>
#include <map>
#define ll long long

using namespace std;

bool visited[100000];
ll n, m, a, b, g, cnt, sz, f, low[100000], st[100000], X[100000];
map <array<ll, 2>, ll> bridge;
vector <ll> G;
vector <array<ll, 2>> bg;
vector <ll> bcc, dp;
vector <ll> adj[100000], E[100000], badj[100000];

void tar(ll u, ll p) {
  G.push_back(u);
  st[u] = low[u] = ++cnt;
  for (auto v : adj[u]) {
    if (!st[v]) {
      tar(v, u);
      low[u] = min(low[u], low[v]);
      if (low[v] > st[u]) {
        ++bridge[{u, v}];
      }
    }
    else if (v != p) {
      low[u] = min(low[u], st[v]);
    }
  }
}

void dfs(ll u) {
  ++sz;
  X[u] = g;
  visited[u] = 1;
  for (auto v : E[u]) {
    if (!visited[v]) {
      dfs(v);
    }
  }
}

void calc(ll u, ll p) {
  dp[u] = bcc[u];
  for (auto v : badj[u]) {
    if (v != p) {
      calc(v, u);
      dp[u] += dp[v];
    }
  }
}

void solve(ll u, ll p, ll w) {
  ll s = 0;
  for (auto v : badj[u]) {
    if (v != p) {
      s += dp[v];
    }
  }
  f += w * s * 2;
  w += s;
  for (auto v : badj[u]) {
    if (v != p) {
      f += bcc[u] * dp[v] * (s-dp[v]);
      solve(v, u, w-dp[v]+bcc[u]);
    }
  }
}

int main() {
  cin >> n >> m;
  for (int i=0; i<m; ++i) {
    cin >> a >> b;
    --a, --b;
    adj[a].push_back(b);
    adj[b].push_back(a);
    X[i] = -1;
  }
  for (int i=0; i<n; ++i) {
    if (!st[i]) {
      G.clear();
      bg.clear();
      bcc.clear();
      tar(i, -1);
      for (auto u : G) {
        for (auto v : adj[u]) {
          if (bridge.find({u, v}) == bridge.end() && bridge.find({v, u}) == bridge.end()) {
            E[u].push_back(v);
            E[v].push_back(u);
          }
          else bg.push_back({u, v});
        }
      }
      g = 0;
      for (auto u : G) {
        if (!visited[u]) {
          sz = 0;
          dfs(u);
          ++g;
          if (sz >= 3) f += sz * (sz-1) * (sz-2);
          bcc.push_back(sz);
        }
      }
      for (auto sz : bcc) {
        if (sz >= 2) f += (sz-1) * (sz-1) * ((ll)G.size() - sz) * 2;
      }
      dp.resize(bcc.size());
      for (auto [x, y] : bg) {
        badj[X[x]].push_back({X[y]});
      }
      calc(0, -1);
      solve(0, -1, 0);
      for (int i=0; i<g; ++i) badj[i].clear();
    }
  }
  cout << f << '\n';
}

컴파일 시 표준 에러 (stderr) 메시지

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:113:17: warning: structured bindings only available with '-std=c++17' or '-std=gnu++17'
  113 |       for (auto [x, y] : bg) {
      |                 ^
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...