제출 #659414

#제출 시각아이디문제언어결과실행 시간메모리
659414activedeltorre철인 이종 경기 (APIO18_duathlon)C++14
0 / 100
137 ms31772 KiB
#include <iostream>
#include <vector>
#include <algorithm>

using namespace std;
long long sef[100005];
long long sz[100005];
long long fre[100005];
long long lvl[100005];
long long best[100005];
long long parent[100005];
vector<pair<long long,long long> >adj[100005];
vector<long long>adi[100005];
long long find (long long u)
{
    if(sef[u]==u)
    {
        return u;
    }
    return sef[u]=find(sef[u]);
}
long long merge (long long a,long long b)
{
    a=find(a);
    b=find(b);
    if(a!=b)
    {
        if(sz[a]<sz[b])
        {
            swap(a,b);
        }
        sef[b]=a;
        sz[a]=sz[a]+sz[b];
        sz[b]=0;
        return 1;
    }
    return 0;
}
struct str
{
    long long a,b,poz,folos=0;
};
str edges[200005];
void dfs(long long curr,long long par)
{
    parent[curr]=par;
    lvl[curr]=lvl[par]+1;
    fre[curr]=1;
    best[curr]=lvl[curr];
    long long i,k;
    for(i=0;i<adj[curr].size();i++)
    {
        k=adj[curr][i].first;
        if(fre[k]==0)
        {
            edges[adj[curr][i].second].folos=1;
            dfs(k,curr);
        }
        else if(k!=par)
        {
            best[curr]=min(best[curr],lvl[k]);
        }
    }
}
bool cmp(long long a,long long b)
{
    return lvl[a]>lvl[b];
}
long long v[100005];
long long suma=0;
long long subtree[100005];
long long n;
void dfs2(long long curr,long long parent)
{
    long long i,k,rest;
    for(i=0;i<adi[curr].size();i++)
    {
        k=adi[curr][i];
        if(k!=parent)
        {
            dfs2(k,curr);
            subtree[curr]=subtree[curr]+subtree[k]+sz[k];
        }
    }
   // for(i=0;i<special)
    rest=n-subtree[curr]-sz[curr];
    suma=suma+sz[curr]*(sz[curr]-1)*(sz[curr]-2);
    suma=suma+sz[curr]*(sz[curr]-1)*(rest)*2;
    suma=suma+sz[curr]*(sz[curr]-1)*(subtree[curr])*2;
    suma=suma+sz[curr]*(subtree[curr])*(rest)*2;
}
int main()
{
    long long i,j,k,l,a,b,m;
    cin>>n>>m;
    for(i=1;i<=n;i++)
    {
        sef[i]=i;
        sz[i]=1;
    }
    for(i=1;i<=m;i++)
    {
        cin>>edges[i].a>>edges[i].b;
        edges[i].poz=i;
        edges[i].folos=0;
        adj[edges[i].a].push_back({edges[i].b,i});
        adj[edges[i].b].push_back({edges[i].a,i});
    }
    dfs(1,0);
    for(i=1;i<=n;i++)
    {
        v[i]=i;
    }
    sort(v+1,v+n+1,cmp);
    for(i=1;i<n;i++)
    {
        if(best[v[i]]<=lvl[v[i]]-1)
        {
            merge(v[i],parent[v[i]]);
        }
    }
    for(i=1;i<n;i++)
    {
        a=find(v[i]);
        b=find(parent[v[i]]);
        if(a!=b)
        {
            adi[a].push_back(b);
            adi[b].push_back(a);
        }
    }
    dfs2(1,0);
    cout<<suma;
    return 0;
}

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

count_triplets.cpp: In function 'void dfs(long long int, long long int)':
count_triplets.cpp:51:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<std::pair<long long int, long long int> >::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   51 |     for(i=0;i<adj[curr].size();i++)
      |             ~^~~~~~~~~~~~~~~~~
count_triplets.cpp: In function 'void dfs2(long long int, long long int)':
count_triplets.cpp:76:14: warning: comparison of integer expressions of different signedness: 'long long int' and 'std::vector<long long int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   76 |     for(i=0;i<adi[curr].size();i++)
      |             ~^~~~~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:94:17: warning: unused variable 'j' [-Wunused-variable]
   94 |     long long i,j,k,l,a,b,m;
      |                 ^
count_triplets.cpp:94:19: warning: unused variable 'k' [-Wunused-variable]
   94 |     long long i,j,k,l,a,b,m;
      |                   ^
count_triplets.cpp:94:21: warning: unused variable 'l' [-Wunused-variable]
   94 |     long long i,j,k,l,a,b,m;
      |                     ^
#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...