# | Time | Username | Problem | Language | Result | Execution time | Memory |
---|---|---|---|---|---|---|---|
659446 | activedeltorre | Duathlon (APIO18_duathlon) | C++14 | 146 ms | 29512 KiB |
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#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<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];
long long numarconex[100005];
long long numar=0;
vector<long long>vec;
void dfs(long long curr,long long par)
{
vec.push_back(curr);
parent[curr]=par;
lvl[curr]=lvl[par]+1;
fre[curr]=1;
best[curr]=lvl[curr];
numar++;
long long i,k;
for(i=0; i<adj[curr].size(); i++)
{
k=adj[curr][i];
if(fre[k]==0)
{
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;
long long total;
void dfs2(long long curr,long long parent)
{
long long i,k,rest,temp;
temp=0;
for(i=0; i<adi[curr].size(); i++)
{
k=adi[curr][i];
if(k!=parent)
{
dfs2(k,curr);
subtree[k]=subtree[k]+sz[k];
subtree[curr]=subtree[curr]+subtree[k];
}
}
rest=numarconex[curr]-sz[curr]-subtree[curr];
for(i=0; i<adi[curr].size(); i++)
{
k=adi[curr][i];
if(k!=parent)
{
suma=suma-sz[curr]*(subtree[k])*(subtree[k]-1);
suma=suma-(sz[curr]-1)*subtree[k]*2;
}
}
suma=suma-sz[curr]*(rest)*(rest-1);
suma=suma-(sz[curr]-1)*rest*2;
// cout<<curr<<" "<<temp<<'\n';
}
int capitan[100005];
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>>a>>b;
adj[a].push_back(b);
adj[b].push_back(a);
}
for(i=1; i<=n; i++)
{
if(fre[i]==0)
{
numar=0;
vec.clear();
dfs(i,0);
capitan[i]=1;
for(j=0; j<vec.size(); j++)
{
numarconex[vec[j]]=numar;
}
}
}
int cnt=0;
for(i=1; i<=n; i++)
{
if(fre[i]==0)
{
cnt++;
}
}
if(cnt!=0)
{
cout<<2/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)
{
best[parent[v[i]]]=min(best[v[i]],best[parent[v[i]]]);
merge(v[i],parent[v[i]]);
}
}
for(i=1; i<n; i++)
{
a=find(v[i]);
b=find(parent[v[i]]);
if(a!=b && capitan[a]==0)
{
adi[a].push_back(b);
adi[b].push_back(a);
}
}
for(i=1; i<=n; i++)
{
if(capitan[i]==1)
{
suma=suma+numarconex[i]*(numarconex[i]-1)*(numarconex[i]-2);
dfs2(find(i),0);
}
}
cout<<suma;
return 0;
}
Compilation message (stderr)
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|---|---|---|---|
Fetching results... |