Submission #104266

#TimeUsernameProblemLanguageResultExecution timeMemory
104266zubecDuathlon (APIO18_duathlon)C++14
0 / 100
297 ms57636 KiB
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;

const int N = 200100;

int n, m;

vector <pair<int, int> > g[N];

ll sz[N];

bool used[N], isBridge[200100];

int tin[N], fup[N], tim;

vector <int> vec;

int clr[N], cnt, szCmp[N], pr[N];

vector <int> gg[N];

vector <int> stck;

vector <vector <int> > cmp;

void findCutpoints(int v, int p){
    tin[v] = fup[v] = ++tim;
    stck.push_back(v);
    used[v] = 1;
    int sons = 0;
    for (int i = 0; i < g[v].size(); i++){
        int to = g[v][i].first, id = g[v][i].second;
        if (to == p)
            continue;
        if (!used[to]){
            findCutpoints(to, v);
            fup[v] = min(fup[v], fup[to]);

            if (tin[v] <= fup[to]){
                cmp.push_back({v});
                while(cmp.back().back() != to){
                    cmp.back().push_back(stck.back());
                    stck.pop_back();
                }
            }

        } else {
            fup[v] = min(fup[v], tin[to]);
        }
    }
}

ll ans = 0;

void dfs1(int v, int p){
    sz[v] = v <= n;
    used[v] = 1;
    for (int i = 0; i < gg[v].size(); i++){
        int to = gg[v][i];
        if (to == p)
            continue;
        dfs1(to, v);
        sz[v] += sz[to];
    }
}
void dfs2(int v, int p, ll n){
    if (v <= n){
        for (int i = 0; i < gg[v].size(); i++){
            int to = gg[v][i];
            if (to == p)
                ans -= sz[v]*(sz[v]-1)*(cmp[to-n-1].size()-1); else
                ans -= (n-sz[to])*(n-sz[to]-1)*(cmp[to-n-1].size()-1);
        }
    }
    for (int i = 0; i < gg[v].size(); i++){
        int to = gg[v][i];
        if (to == p)
            continue;
        dfs2(to, v, n);
    }
}

int main(){
    ios_base::sync_with_stdio(0);cin.tie(0);
    //freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);

    cin >> n >> m;
    for (int i = 1; i <= m; i++){
        int u, v;
        cin >> u >> v;
        g[u].push_back({v, i});
        g[v].push_back({u, i});
    }
    for (int i = 1; i <= n; i++){
        if (!used[i]){
            findCutpoints(i, 0);
        }
    }
    for (int i = 0; i < cmp.size(); i++){
        for (int j = 0; j < cmp[i].size(); j++){
            gg[cmp[i][j]].push_back(n+i+1);
            gg[n+i+1].push_back(cmp[i][j]);
        }
    }
    memset(used, 0, sizeof(used));
    for (int i = 1; i <= n; i++){
        if (!used[i]){
            dfs1(i, 0);
            ans += sz[i]*(sz[i]-1)*(sz[i]-2);
            dfs2(i, 0, sz[i]);
        }
    }

    cout << ans;

}

/**

5 6
1 2
2 3
3 1
2 4
4 5
2 5

4 4
1 2
2 3
3 4
4 2

*/

Compilation message (stderr)

count_triplets.cpp: In function 'void findCutpoints(int, int)':
count_triplets.cpp:33:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[v].size(); i++){
                     ~~^~~~~~~~~~~~~
count_triplets.cpp:34:33: warning: unused variable 'id' [-Wunused-variable]
         int to = g[v][i].first, id = g[v][i].second;
                                 ^~
count_triplets.cpp:32:9: warning: unused variable 'sons' [-Wunused-variable]
     int sons = 0;
         ^~~~
count_triplets.cpp: In function 'void dfs1(int, int)':
count_triplets.cpp:60:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < gg[v].size(); i++){
                     ~~^~~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs2(int, int, ll)':
count_triplets.cpp:70:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int i = 0; i < gg[v].size(); i++){
                         ~~^~~~~~~~~~~~~~
count_triplets.cpp:77:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < gg[v].size(); i++){
                     ~~^~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:101:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < cmp.size(); i++){
                     ~~^~~~~~~~~~~~
count_triplets.cpp:102:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < cmp[i].size(); j++){
                         ~~^~~~~~~~~~~~~~~
#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...