답안 #262194

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
262194 2020-08-12T13:11:05 Z Rouge_Hugo 철인 이종 경기 (APIO18_duathlon) C++14
8 / 100
128 ms 27116 KB
#include<bits/stdc++.h>
#define fi first
#define ll long long
#define pb push_back
#define se second
using namespace std;
int n,m;
ll re=0;
int szz=0;
const int N=200009;
vector<pair<int,int>>v[N];
vector<pair<int,int>>v1[N];
ll cnt=1,t[N],num[N],a[N],low[N],bridge[N],b[N],par[N],vis[N],sz[N],bo[N];
int tt=0;
vector<int>nd;
void dfs (int x,int p)
{
    nd.pb(x);
    vis[x]=1;
    low[x]=num[x]=++tt;
    for(auto it:v[x])
    {
        if (num[it.first]==0)
            dfs(it.first,x);
        if (num[x]<low[it.first])
            bridge[it.second]=1;
        if (it.first!=p)
            low[x]=min(low[x],low[it.first]);
    }
        if(low[x] == num[x]) {
            int w=1;
        while(nd.back() != x) {
            par[nd.back()] = cnt;
            nd.pop_back();w++;
        }
        par[nd.back()] = cnt;
        nd.pop_back();
        bo[cnt]=w;
        cnt++;
    }
}
void dfs2(int x,int p)
{
    vis[x]=1;
    for(auto it:v[x])
    {
        if(it.fi==p)continue;
        if (!vis[it.first])
            dfs2(it.first,x);
        if (bridge[it.second]==1)
        {
            v1[par[x]].push_back({par[it.first],x});
            v1[par[it.first]].push_back({par[x],it.fi});
        }
    }
}
void solve(int x,int p)
{
    vis[x]=1;
    for(auto it:v1[x])
    {
        if(it.fi==p)continue;
        solve(it.fi,x);
        sz[x]+=sz[it.fi];
    }
    sz[x]+=bo[x];
}
void go (int x,int p,ll up)
{
    vis[x]=1;
    sz[x]-=bo[x];
    if(bo[x]>=3)
        re+=bo[x]*(bo[x]-1)*(bo[x]-2);
    re+=(up)*((bo[x])-1)*((bo[x])-1)*2;
    re+=(sz[x])*(bo[x]-1)*(bo[x]-1)*2;int u=0;
    for(auto it:v1[x])
    {
        if(it.fi==p)
        {
            u=it.se;
        }
        if(it.fi==p)continue;
        re+=2*t[x]*sz[it.fi]*(bo[x]-a[it.se] );
        re+=2*t[x]*sz[it.fi];
        a[it.se]+=sz[it.fi];
        t[x]+=sz[it.fi];
        go(it.fi,x,up+bo[x]+sz[x]-sz[it.fi]);
    }
    re+=2*up*bo[x]*(sz[x]-a[u]);
    re+=2*up*a[u];
}
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    scanf("%d %d", &n, &m);
    int x,y;
    for(int i=0; i<m; i++)
    {
        scanf("%d %d", &x, &y);
        v[x].push_back({y,i});
        v[y].push_back({x,i});
    }
    memset (vis,0,sizeof vis);
    for(int i=1;i<n+1;i++)
    {
        if(vis[i])continue;
        dfs(i,-1);
    }
    memset (vis,0,sizeof vis);
    for(int i=1;i<n+1;i++)
    {
        if(vis[i])continue;
        dfs2(i,-1);
    }
    memset (vis,0,sizeof vis);
    for(int i=1;i<cnt;i++)
    {
        if(vis[i])continue;
        solve(i,0);
    }
    re=0;
    memset (vis,0,sizeof vis);
    for(int i=1;i<cnt;i++)
    {
        if(vis[i])continue;
        go(i,0,0);
    }
    cout<<re;
}

Compilation message

count_triplets.cpp: In function 'int main()':
count_triplets.cpp:95:10: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   95 |     scanf("%d %d", &n, &m);
      |     ~~~~~^~~~~~~~~~~~~~~~~
count_triplets.cpp:99:14: warning: ignoring return value of 'int scanf(const char*, ...)', declared with attribute warn_unused_result [-Wunused-result]
   99 |         scanf("%d %d", &x, &y);
      |         ~~~~~^~~~~~~~~~~~~~~~~
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11392 KB Output is correct
2 Correct 8 ms 11392 KB Output is correct
3 Correct 8 ms 11264 KB Output is correct
4 Correct 7 ms 11392 KB Output is correct
5 Correct 7 ms 11264 KB Output is correct
6 Correct 8 ms 11392 KB Output is correct
7 Incorrect 7 ms 11392 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11392 KB Output is correct
2 Correct 8 ms 11392 KB Output is correct
3 Correct 8 ms 11264 KB Output is correct
4 Correct 7 ms 11392 KB Output is correct
5 Correct 7 ms 11264 KB Output is correct
6 Correct 8 ms 11392 KB Output is correct
7 Incorrect 7 ms 11392 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 111 ms 26780 KB Output is correct
2 Correct 103 ms 26732 KB Output is correct
3 Correct 115 ms 25972 KB Output is correct
4 Correct 108 ms 27116 KB Output is correct
5 Correct 108 ms 23412 KB Output is correct
6 Correct 114 ms 25844 KB Output is correct
7 Correct 114 ms 23624 KB Output is correct
8 Correct 113 ms 24568 KB Output is correct
9 Correct 113 ms 22776 KB Output is correct
10 Correct 110 ms 23032 KB Output is correct
11 Correct 97 ms 21496 KB Output is correct
12 Correct 91 ms 21368 KB Output is correct
13 Correct 87 ms 21544 KB Output is correct
14 Correct 84 ms 21240 KB Output is correct
15 Correct 64 ms 21240 KB Output is correct
16 Correct 71 ms 21112 KB Output is correct
17 Correct 14 ms 16128 KB Output is correct
18 Correct 14 ms 16256 KB Output is correct
19 Correct 14 ms 16000 KB Output is correct
20 Correct 14 ms 16000 KB Output is correct
21 Correct 13 ms 15872 KB Output is correct
22 Correct 13 ms 15872 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 11520 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 128 ms 25080 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 8 ms 11520 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 128 ms 25080 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11392 KB Output is correct
2 Correct 8 ms 11392 KB Output is correct
3 Correct 8 ms 11264 KB Output is correct
4 Correct 7 ms 11392 KB Output is correct
5 Correct 7 ms 11264 KB Output is correct
6 Correct 8 ms 11392 KB Output is correct
7 Incorrect 7 ms 11392 KB Output isn't correct
8 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Correct 7 ms 11392 KB Output is correct
2 Correct 8 ms 11392 KB Output is correct
3 Correct 8 ms 11264 KB Output is correct
4 Correct 7 ms 11392 KB Output is correct
5 Correct 7 ms 11264 KB Output is correct
6 Correct 8 ms 11392 KB Output is correct
7 Incorrect 7 ms 11392 KB Output isn't correct
8 Halted 0 ms 0 KB -