Submission #698630

#TimeUsernameProblemLanguageResultExecution timeMemory
698630vjudge1철인 이종 경기 (APIO18_duathlon)C++17
0 / 100
102 ms27084 KiB
#include<bits/stdc++.h>
#define maxn 200500
using namespace std;
int n,m;
vector<int> g[maxn];
bool vis[maxn];
int disc[maxn];
int low[maxn];
bool br[maxn];
int par[maxn];
int cnt[maxn];
int ct=0;
vector<int> b[maxn];
int sz[maxn];
void dfs(int u,int p=-1) {
    vis[u]=true;
    disc[u]=low[u]=ct++;
    sz[u]=1;
    for(auto v:g[u]) {
        if(!vis[v]) {
            dfs(v,u);
            sz[u]+=sz[v];
            par[v]=u;
            low[u]=min(low[u],low[v]);
            if(low[v]>disc[u]) {
                br[v]=true;
            }
        }
        else {
            if(v!=p) low[u]=min(low[u],disc[v]);
        }
    }
}
void dfs_2(int u,int cur=1) {
    vis[u]=true;
    if(br[u]) cur=u;
    for(auto v:g[u]) {
        if(!vis[v]) {
            if(br[v]) b[cur].push_back(v);
            dfs_2(v,cur);
        }
    }
}
void dfs_3(int u) {
    cnt[u]=sz[u];
    for(auto v:b[u]) {
        cnt[u]-=sz[v];
        dfs_3(v);
    }
}
long long ans=0;
void dfs_4(int u) {
    int pc=n-sz[u];
    vector<int> szs;
    if(pc!=0) szs.push_back(pc);
    for(auto v:b[u]) szs.push_back(sz[v]);
    ans = ans+1ll*cnt[u]*(cnt[u]-1)*(cnt[u]-2);
    for(auto s:szs) {
        if(cnt[u]>=2) {
            ans=ans+2ll*(cnt[u]-1)*(cnt[u]-2)*s;
            ans=ans+2ll*(cnt[u]-1)*s;
        }
        ans=ans+1ll*cnt[u]*s*(n-s-cnt[u]);
    }
    for(auto v:b[u]) dfs_4(v);
}
int main() {
    scanf("%d %d",&n,&m);
    for(int i=0;i<m;i++) {
        int u,v;
        scanf("%d %d",&u,&v);
        g[u].push_back(v);
        g[v].push_back(u);
    }
    dfs(1);
    for(int i=1;i<=n;i++) vis[i]=false;
    dfs_2(1);
    dfs_3(1);
    dfs_4(1);
    printf("%lld",ans);
    return 0;
}

Compilation message (stderr)

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:68:10: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   68 |     scanf("%d %d",&n,&m);
      |     ~~~~~^~~~~~~~~~~~~~~
count_triplets.cpp:71:14: warning: ignoring return value of 'int scanf(const char*, ...)' declared with attribute 'warn_unused_result' [-Wunused-result]
   71 |         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...