Submission #1298849

#TimeUsernameProblemLanguageResultExecution timeMemory
1298849altern23Duathlon (APIO18_duathlon)C++20
100 / 100
127 ms28572 KiB
#include <bits/stdc++.h>
using namespace std;

using ll = long long;

const int MAXN = 2e5+5;
const int INF = 1e9;

int N, M, scc[MAXN];
char C, D;
vector <int> adj[MAXN], bct[MAXN];

ll t, group;
int sz[MAXN], tin[MAXN], low[MAXN];
bool ap[MAXN];

stack <ll> stk;

void dfs(ll idx, ll par) {
  stk.push(idx);

  low[idx] = tin[idx] = ++t;
  
  sz[idx] = 1;
  
  for (auto i : adj[idx]) {
    if (!tin[i]) {
      dfs(i, idx);
      low[idx] = min(low[idx], low[i]);
      
      if (low[i] >= tin[idx]) {
        group++;
        
        while (!stk.empty() && stk.top() != i) {
          bct[group].push_back(stk.top());
          bct[stk.top()].push_back(group);
          sz[group] += sz[stk.top()];
          stk.pop();
        }
        
        bct[group].push_back(stk.top());
        bct[stk.top()].push_back(group);
        sz[group] += sz[stk.top()];
        stk.pop();
        
        sz[idx] += sz[group];
        bct[group].push_back(idx);
        bct[idx].push_back(group);
      }
    }
    else if (i != par) {
      low[idx] = min(low[idx], tin[i]);
    }
  }
}

int main () {
    ll N, M; cin >> N >> M;
    for (int i = 1; i <= M; i++) {
      ll u, v; cin >> u >> v;
      adj[u].push_back(v), adj[v].push_back(u);
    }
      
    group = N;    
    ll ans = 0;
    
    for (int i = 1; i <= N; i++) {
      ll lst = group;
      if (!tin[i]) {
        dfs(i, -1);
        for (int j = lst + 1; j <= group; j++) {
          for (auto x : bct[j]) {
            if (sz[x] > sz[j]) {
              ans += ((ll)bct[j].size() - 1) * (sz[i] - sz[j]) * (sz[j] - 1);
            }
            else {
              ans += ((ll)bct[j].size() - 1) * sz[x] * (sz[i] - 1 - sz[x]);
            }
          }
        }
      }
    }
    
    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...