제출 #961053

#제출 시각아이디문제언어결과실행 시간메모리
961053AndreiBOTO철인 이종 경기 (APIO18_duathlon)C++14
100 / 100
73 ms32160 KiB
#include <bits/stdc++.h>

#pragma optimize GCC ("Ofast")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

///#include <tryhardmode>
///#include <GODMODE::ON>

using namespace std;

const int NMAX=2e5+5;

long long sarb[NMAX];
vector<int>cbc[NMAX];
vector<int>v[NMAX];
stack<int>stiva;
long long kon=0;
int tmin[NMAX];
int ti[NMAX];
int timer;
int total;
int saiz;

int n;

void dfs_biconex(int p,int tata)
{
    saiz++;
    ti[p]=++timer;
    tmin[p]=timer;
    stiva.push(p);
    for(auto i:v[p])
    {
        if(tata!=i)
        {
            if(!ti[i])
            {
                dfs_biconex(i,p);
                tmin[p]=min(tmin[p],tmin[i]);
                if(tmin[i]>=ti[p])
                {
                    total++;
                    while(stiva.top()!=i)
                    {
                        cbc[n+total].push_back(stiva.top());
                        stiva.pop();
                    }
                    cbc[n+total].push_back(stiva.top());
                    stiva.pop();
                    cbc[p].push_back(n+total);
                }
            }
            else
                tmin[p]=min(tmin[p],ti[i]);
        }
    }
}

void dfs(int p)
{
    if(p>n)
        sarb[p]=0;
    else
        sarb[p]=1;
    for(auto i:cbc[p])
    {
        dfs(i);
        sarb[p]+=sarb[i];
        if(i<=n)
            kon-=sarb[i]*(sarb[i]-1);
    }
    if(p>n)
    {
        long long s=0;
        for(auto i:cbc[p])
            s+=sarb[i]*(sarb[i]-1);
        for(auto i:cbc[p])
        {
            long long more_paths=s-sarb[i]*(sarb[i]-1);
            long long above=saiz-sarb[p];
            kon-=above*(above-1);
            kon-=more_paths;
        }
    }
}

int main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    cout.tie(NULL);

    int m,i,j;
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        v[x].push_back(y);
        v[y].push_back(x);
    }
    for(i=1;i<=n;i++)
    {
        if(!ti[i])
        {
            saiz=0;
            dfs_biconex(i,0);
            kon+=1LL*saiz*(saiz-1)*(saiz-2);
            dfs(i);
        }
    }
    cout<<kon;
    return 0;
}

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

count_triplets.cpp:3: warning: ignoring '#pragma optimize GCC' [-Wunknown-pragmas]
    3 | #pragma optimize GCC ("Ofast")
      | 
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:94:13: warning: unused variable 'j' [-Wunused-variable]
   94 |     int m,i,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...