제출 #76364

#제출 시각아이디문제언어결과실행 시간메모리
76364Simphoni철인 이종 경기 (APIO18_duathlon)C++14
100 / 100
158 ms102848 KiB
#include <cstdio>
#include <iostream>
#include <cstring>
#include <set>
using namespace std;

typedef long long LL;
const int N = 1e5 + 50;

struct edge {
  int nxt, to;
} E[N << 2], G[N << 4];
int fir[N], lst[N << 1], cnt = 1;

int n, m;
int dfn[N], lo[N], top, clo, bcc, sz[N << 1];
pair <int, int> sta[N];
bool vis[N << 1];
LL ans = 0;

inline void addedge(int x, int y, edge *e = E, int *f = fir) {
  e[++ cnt] = (edge) { f[x], y }; f[x] = cnt;
}

inline int Dfs(int x, int f) {
  int low = lo[x] = dfn[x] = ++ clo, o;
  for (int i = fir[x]; i; i = E[i].nxt)
    if (E[i].to != f) {
      if (!dfn[E[i].to]) {
        sta[++ top] = make_pair(x, E[i].to);
        o = Dfs(E[i].to, x);
        low = min(low, o);
        if (o < dfn[x]) continue;
        bcc ++;
        set <int> tmp;
        while (top) {
          if (!tmp.count(sta[top].first)) {
            addedge(bcc, sta[top].first, G, lst);
            addedge(sta[top].first, bcc, G, lst);
            tmp.insert(sta[top].first);
          }
          if (!tmp.count(sta[top].second)) {
            addedge(bcc, sta[top].second, G, lst);
            addedge(sta[top].second, bcc, G, lst);
            tmp.insert(sta[top].second);
          }
          top --; 
          if (sta[top + 1] == make_pair(x, E[i].to)) break;
        }
        sz[bcc] = tmp.size();
      }
      else low = min(low, lo[E[i].to]);
    }
  return lo[x] = low;
}

inline pair <int, LL> Dfs1(int x) {
  vis[x] = 1;
  pair <int, LL> res = make_pair(0, 0), tmp;
  for (int i = lst[x]; i; i = G[i].nxt)
    if (!vis[G[i].to]) {
      tmp = Dfs1(G[i].to);
      ans += res.second * tmp.first + tmp.second * res.first + (LL)(x <= n ? -1 : sz[x]) * res.first * tmp.first;
      res.first += tmp.first;
      res.second += tmp.second;
    }
  res.second += (LL) res.first * (x <= n ? -1 : sz[x]);
  if (x <= n) ans += res.second, res.first ++, res.second --;
  return res;
}

int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1, x, y; i <= m; i ++) {
    scanf("%d%d", &x, &y);
    addedge(x, y); addedge(y, x);
  }
  bcc = n;
  for (int i = 1; i <= n; i ++) if (!dfn[i]) Dfs(i, 0);
  for (int i = 1; i <= n; i ++) if (!vis[i]) Dfs1(i);
  printf("%lld\n", ans * 2);
  return 0;
}

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

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:73:8: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   scanf("%d%d", &n, &m);
   ~~~~~^~~~~~~~~~~~~~~~
count_triplets.cpp:75:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
     scanf("%d%d", &x, &y);
     ~~~~~^~~~~~~~~~~~~~~~
#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...