Submission #958594

#TimeUsernameProblemLanguageResultExecution timeMemory
958594rxlfd314철인 이종 경기 (APIO18_duathlon)C++17
100 / 100
83 ms31628 KiB
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using ari2 = array<int, 2>;

#define vt vector
#define size(x) (int((x).size()))
#define all(x) begin(x), end(x)

#define REP(a,b,c,d) for (int a=(b);(d)>0?a<=(c):a>=(c);a+=(d))
#define FOR(a,b,c) REP(a,b,c,1)
#define ROF(a,b,c) REP(a,b,c,-1)

signed main() {
#ifndef DEBUG
  ios_base::sync_with_stdio(false);
  cin.tie(nullptr);
#endif
  int N,M;
  cin>>N>>M;
  vt<vt<int>> adj(N);
  FOR(_,1,M){
    int a,b;
    cin>>a>>b;
    adj[--a].push_back(--b);
    adj[b].push_back(a);
  }
  ll ans=0;
  vt<int> tin(N,-1),low(N),szs(N<<1);
  vt<vt<int>> bcc_adj(N<<1);
  int B=0;
  FOR(r,0,N-1){
    if(tin[r]>=0)
      continue;
    int n=0,timer=0;
    vt<int> rem;
    function<void(int,int)> find_bccs=[&](int i,int p){
      n++;
      low[i]=tin[i]=timer++;
      rem.push_back(i);
      for(int j:adj[i]){
        if(j==p)
          continue;
        if(tin[j]>=0)
          low[i]=min(low[i],tin[j]);
        else{
          find_bccs(j,i);
          low[i]=min(low[i],low[j]);
          if(low[j]>=tin[i]){
            bcc_adj[i].push_back(B+N);
            while(!size(bcc_adj[B+N]) || bcc_adj[B+N].back()!=j){
              bcc_adj[B+N].push_back(rem.back());
              rem.pop_back();
            }
            B++;
          }
        }
      }
    };
    find_bccs(r,r);
    ans+=1ll*n*(n-1)*(n-2);
    function<void(int)> dfs=[&](int i){
      szs[i]=i<N;
      for(int j:bcc_adj[i]){
        dfs(j);
        szs[i]+=szs[j];
        if(i>=N)
          ans-=1ll*size(bcc_adj[i])*szs[j]*(szs[j]-1);
      }
      if(i>=N)
        ans-=1ll*size(bcc_adj[i])*(n-szs[i])*(n-szs[i]-1);
    };
    dfs(r);
  }
  cout<<ans<<'\n';
}
#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...