제출 #159034

#제출 시각아이디문제언어결과실행 시간메모리
159034arnold518철인 이종 경기 (APIO18_duathlon)C++14
100 / 100
246 ms38392 KiB
#include <bits/stdc++.h>
using namespace std;

typedef long long ll;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;

const int MAXN = 2e5;

int N, M;
vector<int> adj[MAXN+10];

int idx[MAXN+10], low[MAXN+10], cnt, S;
ll ans;

void dfs(int now, int bef)
{
    S++;
    idx[now]=low[now]=++cnt;
    for(auto nxt : adj[now])
    {
        if(nxt==bef) continue;
        if(!idx[nxt])
        {
            dfs(nxt, now);
            low[now]=min(low[now], low[nxt]);
        }
        else
        {
            low[now]=min(low[now], idx[nxt]);
        }
    }
}

bool vis[MAXN+10];
int sz[MAXN+10];
vector<int> bcc[MAXN+10], adj2[MAXN+10];
int ccnt;

void color(int now, int col)
{
    vis[now]=true;
    if(col)
    {
        bcc[now].push_back(col);
        adj2[now].push_back(col);
        adj2[col].push_back(now);
    }

    for(int nxt : adj[now])
    {
        if(vis[nxt]) continue;
        if(idx[now]<=low[nxt])
        {
            ccnt++;
            bcc[now].push_back(ccnt);
            adj2[now].push_back(ccnt);
            adj2[ccnt].push_back(now);
            color(nxt, ccnt);
        }
        else
        {
            color(nxt, col);
        }
    }
}

void calc(int now, int bef)
{
    if(now<=N) sz[now]=1;
    for(auto nxt : adj2[now])
    {
        if(nxt==bef) continue;
        calc(nxt, now);
        sz[now]+=sz[nxt];
    }
    if(now>N)
    {
        for(auto nxt : adj2[now])
        {
            if(nxt!=bef) ans-=(ll)sz[nxt]*(sz[nxt]-1)*(adj2[now].size()-1);
            else ans-=(ll)(S-sz[now])*(S-sz[now]-1)*(adj2[now].size()-1);
        }
    }
}

int main()
{
    int i, j;

    scanf("%d%d", &N, &M);
    for(i=1; i<=M; i++)
    {
        int u, v;
        scanf("%d%d", &u, &v);
        adj[u].push_back(v);
        adj[v].push_back(u);
    }

    ccnt=N;
    for(i=1; i<=N; i++)
    {
        if(vis[i]) continue;
        S=0;
        dfs(i, i);
        color(i, 0);
        ans+=(ll)S*(S-1)*(S-2);
        calc(i, i);
    }

    printf("%lld", ans);
}

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

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:89:12: warning: unused variable 'j' [-Wunused-variable]
     int i, j;
            ^
count_triplets.cpp:91: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:95:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
         scanf("%d%d", &u, &v);
         ~~~~~^~~~~~~~~~~~~~~~
#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...