Submission #49640

#TimeUsernameProblemLanguageResultExecution timeMemory
49640gs13105Duathlon (APIO18_duathlon)C++17
100 / 100
275 ms30672 KiB
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <cassert>
#include <iostream>
#include <algorithm>
#include <string>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <deque>
#include <set>
#include <map>
#include <tuple>
#include <iterator>

using namespace std;

const int MAXN = 100000;

vector<int> arr[MAXN + 10];
int dis[MAXN + 10];
int low[MAXN + 10];
int tim;

vector<int> bcc[MAXN + 10];
vector<int> cmp[MAXN + 10];
int siz;

int cur;

void f(int x, int p)
{
    cur++;
    dis[x] = ++tim;
    low[x] = dis[x];

    for(int &y : arr[x])
    {
        if(y == p)
            continue;

        if(!dis[y])
        {
            f(y, x);
            low[x] = min(low[x], low[y]);
        }
        else
            low[x] = min(low[x], dis[y]);
    }
}

void color(int x, int c)
{
    if(c)
    {
        bcc[c].push_back(x);
        cmp[x].push_back(c);
    }
    for(auto &i : arr[x])
    {
        if(cmp[i].size())
            continue;
        if(low[i] >= dis[x])
        {
            bcc[++siz].push_back(x);
            cmp[x].push_back(siz);
            color(i, siz);
        }
        else
            color(i, c);
    }
}

int cnt[MAXN + 10];

long long g(int c, int p)
{
    long long r = 0;
    long long t = 0;
    for(int x : bcc[c])
    {
        if(x == p)
        {
            cnt[c]++;
            continue;
        }

        int sum = 1;
        for(int d : cmp[x])
        {
            if(d == c)
                continue;

            r += g(d, x);
            sum += cnt[d] - 1;
        }
        cnt[c] += sum;
        t += 1LL * sum * (sum - 1);
    }

    if(p)
    {
        int tmp = cur - cnt[c] + 1;
        t += 1LL * tmp * (tmp - 1);
    }

    r += ((int)bcc[c].size() - 1) * t;
    return r;
}

int main()
{
    //freopen("in", "r", stdin);
    //freopen("out", "w", stdout);

    int n, m, i;
    scanf("%d%d", &n, &m);
    for(i = 0; i < m; i++)
    {
        int x, y;
        scanf("%d%d", &x, &y);
        arr[x].push_back(y);
        arr[y].push_back(x);
    }

    long long r = 0;
    for(i = 1; i <= n; i++)
    {
        if(dis[i])
            continue;

        cur = 0;
        f(i, 0);
        color(i, 0);

        if(cur < 3)
            continue;

        long long t = g(siz, 0);
        int sz = cur;
        r += 1LL * sz * (sz - 1) * (sz - 2) - t;
    }

    printf("%lld", r);
    return 0;
}

Compilation message (stderr)

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:119:10: 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:123:14: 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...