제출 #111220

#제출 시각아이디문제언어결과실행 시간메모리
111220SamAnd철인 이종 경기 (APIO18_duathlon)C++17
66 / 100
544 ms44924 KiB
#include <bits/stdc++.h>
using namespace std;
#define m_p make_pair
const int N = 100005;

int n, m;
vector<int> a[N];

long long ans;

int c[N];
int tin[N], ti;
int fup[N];
set<pair<int, int> > s;
void dfs0(int x, int p)
{
    c[x] = 1;
    fup[x] = tin[x] = ti++;
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (h == p)
            continue;
        if (c[h])
        {
            fup[x] = min(fup[x], tin[h]);
        }
        else
        {
            dfs0(h, x);
            if (tin[x] < fup[h])
            {
                s.insert(m_p(x, h));
                s.insert(m_p(h, x));
            }
            fup[x] = min(fup[x], fup[h]);
        }
    }
}

int k;
void dfs01(int x)
{
    c[x] = k;
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (s.find(m_p(x, h)) != s.end())
            continue;
        if (!c[h])
            dfs01(h);
    }
}

int cc[N];
int kk;
void dfs02(int x)
{
    cc[x] = kk;
    for (int i = 0; i < a[x].size(); ++i)
    {
        int h = a[x][i];
        if (!cc[h])
            dfs02(h);
    }
}

vector<int> v[N];

vector<int> t[N];
vector<int> g[N];
vector<int> gg[N];

int px[N];
int pp[N];
int q[N];
void dfs03(int x, int p, int u)
{
    pp[x] = u;
    q[x] = v[x].size();
    for (int i = 0; i < g[x].size(); ++i)
    {
        int h = g[x][i];
        if (h == p)
            continue;
        px[h] = gg[x][i];
        dfs03(h, x, u);
        q[x] += q[h];
    }
}

void solv0()
{
    for (int i = 1; i <= n; ++i)
    {
        if (!c[i])
            dfs0(i, i);
    }
    memset(c, 0, sizeof c);
    for (int i = 1; i <= n; ++i)
    {
        if (!c[i])
        {
            ++k;
            dfs01(i);
        }
    }
    for (int i = 1; i <= n; ++i)
    {
        if (!cc[i])
        {
            ++kk;
            dfs02(i);
        }
    }

    for (set<pair<int, int> >::iterator it = s.begin(); it != s.end(); ++it)
    {
        g[c[(*it).first]].push_back(c[(*it).second]);
        gg[c[(*it).first]].push_back((*it).first);
        t[(*it).first].push_back((*it).second);
    }

    for (int i = 1; i <= n; ++i)
        v[c[i]].push_back(i);

    for (int i = 1; i <= k; ++i)
    {
        if (!pp[i])
            dfs03(i, i, i);
    }

    for (int i = 1; i <= k; ++i)
    {
        long long ysum = 0;
        vector<long long> sum;
        sum.assign(v[i].size(), 0);
        for (int j = 0; j < v[i].size(); ++j)
        {
            int x = v[i][j];
            for (int k = 0; k < t[x].size(); ++k)
            {
                int y = t[x][k];
                if (y != px[i])
                    sum[j] += q[c[y]];
                else
                    sum[j] += (q[pp[i]] - q[i]);
            }
            for (int k = 0; k < t[x].size(); ++k)
            {
                int y = t[x][k];
                if (y != px[i])
                {
                    sum[j] -= q[c[y]];
                    ans += (sum[j] * q[c[y]]);
                    sum[j] += q[c[y]];
                }
                else
                {
                    sum[j] -= (q[pp[i]] - q[i]);
                    ans += (sum[j] * (q[pp[i]] - q[i]));
                    sum[j] += (q[pp[i]] - q[i]);
                }
            }
            sum[j]++;
            ysum += sum[j];
        }
        long long yysum = 0;
        for (int j = 0; j < v[i].size(); ++j)
        {
            ysum -= sum[j];
            ans += ((sum[j] - 1) * ysum) * 2;
            yysum += (sum[j] * ysum);
            ysum += sum[j];
        }
        for (int j = 0; j < v[i].size(); ++j)
        {
            ysum -= sum[j];
            yysum -= (sum[j] * ysum) * 2;
            ans += yysum;
            yysum += (sum[j] * ysum) * 2;
            ysum += sum[j];
        }
    }
    cout << ans << endl;
}

int main()
{
    //freopen("input.txt", "r", stdin);
    cin >> n >> m;
    for (int i = 0; i < m; ++i)
    {
        int x, y;
        cin >> x >> y;
        a[x].push_back(y);
        a[y].push_back(x);
    }
    solv0();
    return 0;
}

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

count_triplets.cpp: In function 'void dfs0(int, int)':
count_triplets.cpp:19:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs01(int)':
count_triplets.cpp:45:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs02(int)':
count_triplets.cpp:60:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < a[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs03(int, int, int)':
count_triplets.cpp:81:23: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for (int i = 0; i < g[x].size(); ++i)
                     ~~^~~~~~~~~~~~~
count_triplets.cpp: In function 'void solv0()':
count_triplets.cpp:138:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < v[i].size(); ++j)
                         ~~^~~~~~~~~~~~~
count_triplets.cpp:141:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int k = 0; k < t[x].size(); ++k)
                             ~~^~~~~~~~~~~~~
count_triplets.cpp:149:31: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
             for (int k = 0; k < t[x].size(); ++k)
                             ~~^~~~~~~~~~~~~
count_triplets.cpp:169:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < v[i].size(); ++j)
                         ~~^~~~~~~~~~~~~
count_triplets.cpp:176:27: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for (int j = 0; j < v[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...