제출 #54047

#제출 시각아이디문제언어결과실행 시간메모리
54047Bodo171Duathlon (APIO18_duathlon)C++14
100 / 100
486 ms69720 KiB
#include <iostream>
#include <fstream>
#include <vector>
using namespace std;
const int nmax=300005;
vector <pair<int,int> > v[nmax];
vector<int> agatat[nmax],ad[nmax],li[nmax],vec[nmax];
long long ans;
long long sum[nmax],w[nmax];
int a[nmax],b[nmax],st[nmax],lev[nmax],low[nmax],unic[nmax],rada[nmax],ap[nmax],tt[nmax],L[nmax],gr[nmax];
int n,m,i,j,bcc,u,Xul;
void chestie(int x)
{
    if(unic[x]&&unic[x]!=bcc) unic[x]=-1;
    else unic[x]=bcc;
}
void mark(int P)
{
    li[bcc].push_back(a[st[u]]);
    li[bcc].push_back(b[st[u]]);
    chestie(a[st[u]]);
    chestie(b[st[u]]);
    while(!agatat[u].empty())
    {
        ad[n+bcc].push_back(agatat[u].back());
        ad[agatat[u].back()].push_back(n+bcc);
        agatat[u].pop_back();
    }
    if(st[u]==P)
    {
        u--;
        agatat[u].push_back(Xul);
        return;
    }
    u--;
    mark(P);
}
void dfs(int x)
{
    int nod=0;
    low[x]=lev[x];
    for(int i=0;i<v[x].size();i++)
        if(!lev[v[x][i].first])
    {
        nod=v[x][i].first;st[++u]=v[x][i].second;
        lev[nod]=lev[x]+1;
        dfs(nod);
        if(low[nod]<low[x]) low[x]=low[nod];
        if(low[nod]>=lev[x])
        {
            bcc++;
            ad[x].push_back(n+bcc);
            ad[n+bcc].push_back(x);
            Xul=x;
            mark(v[x][i].second);
        }
    }
    else low[x]=min(low[x],lev[v[x][i].first]);
}
void defeseu(int x)
{
    int nod=0;
    if(x<=n){sum[x]=1LL*L[x];w[x]=1;}
    for(int i=0;i<vec[x].size();i++)
    {
        nod=vec[x][i];
        if(!tt[nod])
        {
            tt[nod]=x;
            L[nod]=L[x]+gr[nod];
            defeseu(nod);
            ans+=2LL*(1LL*sum[nod]*w[x]+1LL*sum[x]*w[nod]-1LL*w[x]*w[nod]*L[tt[x]]-1LL*w[x]*w[nod]*L[x]);
            sum[x]+=1LL*sum[nod];
            w[x]+=w[nod];
        }
    }
}
int main()
{
    //freopen("data.in","r",stdin);
    cin>>n>>m;
    for(i=1;i<=m;i++)
    {
        cin>>a[i]>>b[i];
        v[a[i]].push_back({b[i],i});
        v[b[i]].push_back({a[i],i});
    }
    for(int rr=1;rr<=n;rr++)
        if(!lev[rr])
    {
        rada[rr]=1;
        lev[rr]=1;
        dfs(rr);
    }
    for(i=1;i<=n;i++)
        if(rada[i]==0&&unic[i]!=-1)
    {
        ad[n+unic[i]].push_back(i);
        ad[i].push_back(unic[i]+n);
    }
    for(i=1;i<=n+bcc;i++)
    {
        for(j=0;j<ad[i].size();j++)
            ap[ad[i][j]]=1;
        for(j=0;j<ad[i].size();j++)
            if(ap[ad[i][j]])
              ap[ad[i][j]]=0,vec[i].push_back(ad[i][j]);
        if(i>n) gr[i]=vec[i].size()-1;
    }
    //O(n) pana aici
    for(int rr=1;rr<=n;rr++)
        if(!tt[rr])
    {
        tt[rr]=n+bcc+1;
        defeseu(rr);
        ans-=1LL*w[rr]*(w[rr]-1);
    }
    //brutulica aici
    cout<<ans;
    return 0;
}

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

count_triplets.cpp: In function 'void dfs(int)':
count_triplets.cpp:42:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<v[x].size();i++)
                 ~^~~~~~~~~~~~
count_triplets.cpp: In function 'void defeseu(int)':
count_triplets.cpp:64:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
     for(int i=0;i<vec[x].size();i++)
                 ~^~~~~~~~~~~~~~
count_triplets.cpp: In function 'int main()':
count_triplets.cpp:103:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j=0;j<ad[i].size();j++)
                 ~^~~~~~~~~~~~~
count_triplets.cpp:105:18: warning: comparison between signed and unsigned integer expressions [-Wsign-compare]
         for(j=0;j<ad[i].size();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...